尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

CircularProgressView与MVVM架构集成:ViewModel中的进度管理

CircularProgressView与MVVM架构集成:ViewModel中的进度管理
📅 发布时间:2026/7/4 22:01:45

CircularProgressView与MVVM架构集成:ViewModel中的进度管理

【免费下载链接】CircularProgressViewMaterial style circular progress bar for Android项目地址: https://gitcode.com/gh_mirrors/ci/CircularProgressView

CircularProgressView是一款Material风格的Android圆形进度条组件,它能为应用提供现代化的进度展示效果。在MVVM架构中,将进度管理逻辑放在ViewModel中可以实现更好的代码分离和可测试性。本文将详细介绍如何将CircularProgressView与MVVM架构无缝集成,以及如何在ViewModel中高效管理进度状态。

为什么选择MVVM架构管理进度?

MVVM(Model-View-ViewModel)架构通过数据绑定机制将UI组件与业务逻辑分离,特别适合处理进度这类需要动态更新的UI元素。使用ViewModel管理进度有以下优势:

  • 生命周期感知:ViewModel与Activity/Fragment的生命周期解耦,避免内存泄漏
  • 数据驱动UI:通过LiveData自动通知UI更新进度变化
  • 可测试性:业务逻辑集中在ViewModel,便于单元测试
  • 代码分离:UI控制器只需关注数据展示,无需处理进度逻辑

快速集成CircularProgressView到项目

首先需要将CircularProgressView添加到你的Android项目中。通过以下步骤快速集成:

  1. 克隆项目仓库:
git clone https://gitcode.com/gh_mirrors/ci/CircularProgressView
  1. 在布局文件中添加CircularProgressView组件,例如在example/src/main/res/layout/activity_main.xml中:
<com.github.rahatarmanahmed.cpv.CircularProgressView android:id="@+id/progressView" android:layout_width="50dp" android:layout_height="50dp" app:cpv_animAutostart="true" app:cpv_indeterminate="true"/>

CircularProgressView提供了两种主要的进度展示模式,适用于不同场景:

1. 不确定模式(Indeterminate)

不确定模式适用于无法预估完成时间的任务,如网络请求加载过程。

在XML中启用不确定模式:

app:cpv_indeterminate="true"

2. 确定模式(Determinate)

确定模式适用于可以精确计算进度的任务,如下载文件或数据处理。

切换到确定模式并设置进度:

progressView.setIndeterminate(false); progressView.setProgress(65); // 设置65%进度

ViewModel中实现进度管理逻辑

创建进度管理ViewModel

创建一个专门的ViewModel来管理进度状态,使用LiveData保存进度值:

public class ProgressViewModel extends ViewModel { private MutableLiveData<Integer> progress = new MutableLiveData<>(); private MutableLiveData<Boolean> isIndeterminate = new MutableLiveData<>(); public ProgressViewModel() { progress.setValue(0); isIndeterminate.setValue(true); } public LiveData<Integer> getProgress() { return progress; } public LiveData<Boolean> getIsIndeterminate() { return isIndeterminate; } public void setProgress(int value) { progress.setValue(value); } public void setIndeterminate(boolean indeterminate) { isIndeterminate.setValue(indeterminate); } // 模拟耗时任务 public void simulateProgressTask() { new Thread(() -> { try { setIndeterminate(true); Thread.sleep(2000); // 模拟初始加载 setIndeterminate(false); for (int i = 0; i <= 100; i++) { setProgress(i); Thread.sleep(50); // 模拟进度更新 } } catch (InterruptedException e) { e.printStackTrace(); } }).start(); } }

在Activity中绑定ViewModel

在MainActivity中通过ViewModelProvider获取ViewModel实例,并建立数据绑定:

public class MainActivity extends AppCompatActivity { private ProgressViewModel progressViewModel; private CircularProgressView progressView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); progressView = findViewById(R.id.progressView); progressViewModel = new ViewModelProvider(this).get(ProgressViewModel.class); // 观察进度变化 progressViewModel.getProgress().observe(this, progress -> { progressView.setProgress(progress); }); // 观察模式变化 progressViewModel.getIsIndeterminate().observe(this, isIndeterminate -> { progressView.setIndeterminate(isIndeterminate); }); // 启动模拟任务 findViewById(R.id.startButton).setOnClickListener(v -> { progressViewModel.simulateProgressTask(); }); } }

高级进度管理技巧

1. 进度状态封装

创建一个密封类封装不同的进度状态,使状态管理更清晰:

sealed class ProgressState { object Loading : ProgressState() data class ProgressUpdate(val value: Int) : ProgressState() object Completed : ProgressState() data class Error(val message: String) : ProgressState() } // 在ViewModel中使用 private MutableLiveData<ProgressState> progressState = new MutableLiveData<>();

2. 使用Coroutine优化异步操作

将Java线程替换为Kotlin Coroutine,简化异步进度管理:

fun simulateProgressTask() = viewModelScope.launch { progressState.value = ProgressState.Loading delay(2000) for (i in 0..100) { progressState.value = ProgressState.ProgressUpdate(i) delay(50) } progressState.value = ProgressState.Completed }

3. 自定义进度样式

通过修改circularprogressview/src/main/res/values/attrs.xml中的属性,自定义进度条外观:

<attr name="cpv_color" format="color" /> <attr name="cpv_strokeWidth" format="dimension" /> <attr name="cpv_animDuration" format="integer" /> <attr name="cpv_indeterminate" format="boolean" />

在布局中应用自定义属性:

<com.github.rahatarmanahmed.cpv.CircularProgressView ... app:cpv_color="@color/primary" app:cpv_strokeWidth="4dp" app:cpv_animDuration="1500"/>

常见问题与解决方案

问题1:进度更新不及时

解决方案:确保在主线程更新LiveData,或使用postValue()方法:

// 在后台线程更新进度 progress.postValue(newProgress);

问题2:配置变化后进度丢失

解决方案:ViewModel会自动保留数据,确保正确实现数据观察:

// 正确的观察方式(在onCreate中) progressViewModel.getProgress().observe(this, progress -> { progressView.setProgress(progress); });

问题3:内存泄漏风险

解决方案:使用ViewModel的生命周期感知特性,避免在ViewModel中持有Activity引用。

总结

通过将CircularProgressView与MVVM架构集成,我们实现了进度逻辑与UI的解耦,提高了代码的可维护性和可测试性。关键步骤包括:

  1. 添加CircularProgressView到布局文件
  2. 创建管理进度的ViewModel
  3. 使用LiveData实现数据绑定
  4. 观察进度变化并更新UI

这种架构不仅适用于进度管理,也可推广到其他需要动态更新的UI组件,是现代Android应用开发的最佳实践之一。通过本文介绍的方法,你可以轻松实现优雅的进度管理功能,为用户提供更好的应用体验。

【免费下载链接】CircularProgressViewMaterial style circular progress bar for Android项目地址: https://gitcode.com/gh_mirrors/ci/CircularProgressView

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

  • 大模型LangChain面试题及参考答案(上)
  • Windows 11本地部署GLM-5.2大模型:11999元成本实现11t/s推理与Agent集成
  • Obsidian-skills:为AI代理注入Obsidian超能力,开启智能知识管理新纪元

最新新闻

  • GAN模型选型实战地图:从工业质检到医疗影像的四次关键跃迁
  • 若依WMS-VUE:企业级数字孪生仓储平台的现代化架构实践
  • 机器学习假设检验实战:二项检验 Python 代码实现与置信度计算
  • 遗传算法实战进阶:选择压力、交叉适配与自适应变异
  • 加密算法实战指南:从哈希、AES到RSA,构建系统安全防线
  • 3步让老旧电脑焕发新生:Mem Reduct内存优化实战指南

日新闻

  • STM32F745VG与MC6470 IMU的高性能姿态控制系统设计
  • 机器不消费,人何以生存
  • AI项目操作手册编写规范与最佳实践

周新闻

  • Windows字体自定义终极方案:No!! MeiryoUI完全指南
  • Deepin Boot Maker:告别命令行,3分钟制作Linux启动盘的智能解决方案
  • Plain Craft Launcher 2:重新定义你的Minecraft游戏体验

月新闻

  • 2026年6月公司网站搭建最新热门渠道测评:四大低成本/零代码平台对比+避坑
  • 【Linux】Linux arm 编译QT程序,出现expected “}“报错
  • 【MATLAB例程】四基站二维AOA定位与距离辅助增强对比仿真。基于角度观测和测距修正的固定目标平面定位精度分析

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号