公司动态

如何用FlickerProgressBar实现真实下载进度联动:Handler+Thread模拟下载实战

📅 2026/8/17 16:31:45
如何用FlickerProgressBar实现真实下载进度联动:Handler+Thread模拟下载实战
如何用FlickerProgressBar实现真实下载进度联动HandlerThread模拟下载实战【免费下载链接】FlickerProgressBarAndroid 仿应用宝下载进度条项目地址: https://gitcode.com/gh_mirrors/fl/FlickerProgressBarFlickerProgressBar 是一款 Android 仿应用宝下载进度条开源控件自带左右闪动的滑块、下载中百分比文字和下载完成变色等特效。很多新手拿到控件后最困惑的问题就是进度条怎么和真实的下载过程联动本文用 Handler Thread 模拟一次下载带你从零实现下载进度条、暂停继续、下载完成三者的实时联动掌握 Android 下载进度更新最标准的写法。一、FlickerProgressBar 是什么仿应用宝下载进度条控件FlickerProgressBar 是仿照应用宝腾讯应用商店下载按钮效果打造的自定义 View下载时进度条内有一个滑块左右来回闪动并实时显示下载中 xx%暂停后变为橙色继续文字下载完成则显示下载完成。效果与应用宝真实场景几乎一致看下面这张真实截图就能感受到它的还原度控件支持哪些自定义属性属性名说明默认值loadingColor下载中的颜色#40c4ff蓝色stopColor暂停时和下载完成颜色#ff9800橙色textSize进度文本字体大小12spradius圆角0dpborderWidth背景边框宽度1dp核心 API 也很简单setProgress()设置进度、toggle()暂停/继续、finishLoad()完成下载、reset()重置具体实现见 FlikerProgressBar.java 和属性定义文件 attrs.xml。二、下载进度联动的核心原理为什么用 Handler ThreadAndroid 规定耗时任务不能放在主线程UI 线程执行否则会卡顿甚至 ANR。而进度条更新又必须在主线程完成所以标准的做法就是Thread子线程模拟或执行真实的下载任务计算进度Handler消息队列把子线程里的进度邮递回主线程再调用setProgress()刷新进度条。这种子线程干活、Handler 回传、主线程更新 UI的模式是 Android 所有进度条联动的通用套路搞懂它你就能举一反三。三、快速接入布局里放一个下载进度条在项目 settings.gradle 中引入:flickerprogressbar模块后布局里这样声明即可com.beiing.flikerprogressbar.FlikerProgressBar android:idid/flikerbar android:layout_widthmatch_parent android:layout_heightwrap_content app:textSize12sp app:loadingColor#40c4ff app:stopColor#ff9800 /完整布局见 activity_main.xml里面还演示了radius20dp的圆角版本。四、实战Handler Thread 模拟下载进度联动下面进入正题参考官方 Demo MainActivity.java 完整实现。4.1 创建下载线程模拟进度增长用一个子线程模拟下载过程每 200ms 进度加 2通过中断标志控制停止private void downLoad() { downLoadThread new Thread(this); // this 实现了 Runnable downLoadThread.start(); } Override public void run() { try { while (!downLoadThread.isInterrupted()) { float progress flikerProgressBar.getProgress(); progress 2; // 模拟下载进度增长 Thread.sleep(200); // 模拟网络耗时 Message msg handler.obtainMessage(); msg.arg1 (int) progress; // 把进度装进消息 handler.sendMessage(msg); // 发送给主线程 if (progress 100) break; // 下载完成 } } catch (InterruptedException e) { e.printStackTrace(); } }4.2 用 Handler 回传进度并刷新进度条主线程里的 Handler 收到消息后直接更新两个进度条进度到 100 就调用finishLoad()让控件进入下载完成状态Handler handler new Handler() { Override public void handleMessage(Message msg) { flikerProgressBar.setProgress(msg.arg1); // 刷新进度 roundProgressbar.setProgress(msg.arg1); if (msg.arg1 100) { // 下载完成 flikerProgressBar.finishLoad(); roundProgressbar.finishLoad(); } } };到这里子线程算进度 → Handler 回传 → setProgress 刷新的下载进度联动闭环就打通了。4.3 点击暂停 / 继续进度实时联动点击进度条时用toggle()切换状态暂停就中断下载线程继续就重新启动进度条颜色和文字会自动在下载中/继续之间切换Override public void onClick(View v) { if (!flikerProgressBar.isFinish()) { flikerProgressBar.toggle(); // 控件内部切换暂停/继续 roundProgressbar.toggle(); if (flikerProgressBar.isStop()) { downLoadThread.interrupt(); // 暂停中断线程 } else { downLoad(); // 继续重新启动线程 } } }4.4 下载完成与一键重置下载完成后点重新下载按钮先中断旧线程再调用reset()复位进度条最后重新开始下载public void reLoad(View view) { downLoadThread.interrupt(); // 中断旧下载线程 flikerProgressBar.reset(); // 进度、状态全部复位 roundProgressbar.reset(); downLoad(); // 重新下载 }五、进阶技巧把模拟进度换成真实下载进度模拟下载只是演示真实项目里你只需要做一件事在下载回调里调用setProgress()。比如使用 OkHttp 下载文件时onResponse回调里能拿到bytesRead和contentLength计算百分比后回传即可// 真实下载回调中 float progress bytesRead * 100f / contentLength; runOnUiThread(() - flikerProgressBar.setProgress(progress));setProgress()内部会自动处理进度超过 100 时封顶并触发finishLoad()所以你不用担心溢出见 FlikerProgressBar.java。六、常见坑与避坑指南⚠️必须在主线程更新进度条子线程里直接调setProgress()会崩溃务必通过 Handler 或runOnUiThread回传⚠️中断的是 Thread 对象而非 thisinterrupt()要作用在真实的下载线程实例上否则 while 条件判断会失效⚠️进度上限处理进度传 100 后控件会自动finishLoad()无需手动重复调用⚠️重置记得先中断线程否则旧线程还在跑进度会自己涨回去。写在最后通过本文你可以看到FlickerProgressBar 把复杂的绘制、闪烁动画和状态切换都封装好了你只需要专注于进度从哪来这一件事用 Handler Thread 就能做出仿应用宝的下载进度联动效果。动手试试吧把 Demo 跑起来再替换成你自己的真实下载逻辑一个专业级的下载进度条就完成了【免费下载链接】FlickerProgressBarAndroid 仿应用宝下载进度条项目地址: https://gitcode.com/gh_mirrors/fl/FlickerProgressBar创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考