Java删除多文件时progressBar不增长直接跳转最大值问题求助
问题原因
- 变量捕获异常:循环内创建的匿名Runnable类捕获的是循环变量
i的引用,而非创建Runnable时刻i的瞬时值。循环执行速度远快于子线程启动调度速度,等所有子线程实际执行run()方法时,for循环已经运行完毕,此时i的值已经等于列表总大小95,所有线程最终都给进度条设置了相同的最大值,导致进度直接跳满。 - UI操作线程错误:Android的UI控件更新必须在主线程执行,你在子线程直接调用
progressBar.setProgress()属于违规操作,即使部分场景不会触发崩溃,也会导致更新时序异常、渲染错误。 - 线程滥用问题:循环内每次都创建新线程,既浪费系统资源,也无法保证进度更新的顺序和时机正确。
修正方案
把整个删除逻辑放到单独的子线程中执行,每次删除文件后切换到UI线程更新进度即可,参考代码如下:
FileUtil.listDir("/storage/emulated/0/Alarms/", listStr); int total = listStr.size(); progressBar.setMax(total); // 整个删除逻辑放在单个子线程执行,避免频繁创建线程 new Thread(() -> { for (int i = 0; i < total; i++) { String path = listStr.get(i); if (FileUtil.isFile(path)) { FileUtil.deleteFile(path); } int currentProgress = i + 1; // 从1开始计数,避免刚进入循环显示0的体验问题 // 切换到主线程更新进度条 progressBar.post(() -> { progressBar.setProgress(currentProgress); }); } }).start();
如果你的代码运行在Activity场景下,也可以把progressBar.post()替换成runOnUiThread()执行UI更新操作。
内容的提问来源于stack exchange,提问作者Hasni
相关产品推荐
相关产品推荐

