You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android RecyclerView多并行循环进度条实现问题(AsyncTask异常)

问题分析

你的问题根源在于AsyncTask默认的执行器是串行的(从Android 3.0开始,AsyncTask默认使用SERIAL_EXECUTOR)。每次在onPostExecute里创建新的AsyncTask并调用execute(),任务会被加入串行队列,当积累一定数量后,就会出现进度条串行填充的情况。

解决方案

1. 强制AsyncTask并行执行

把execute()改成executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR),让每个AsyncTask在线程池内并行运行:

@Override
protected void onPostExecute(Void aVoid) {
    super.onPostExecute(aVoid);
    repository.IncrBalancePotato(positionEnd);
    progressBar.setProgress(0);
    new ProgressBarAsyncTask(progressBar, progressItem, positionEnd)
        .executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
}

2. 改用Kotlin协程(更推荐的现代方案)

如果项目支持Kotlin,协程比AsyncTask更灵活,且能更好地管理生命周期、避免内存泄漏:

// 在RecyclerView的ViewHolder中实现循环进度逻辑
fun startProgressLoop() {
    lifecycleScope.launch(Dispatchers.IO) {
        while (true) {
            // 模拟进度逐步填充
            for (progress in 0..100) {
                delay(50) // 替换为你的进度更新间隔
                withContext(Dispatchers.Main) {
                    progressBar.setProgress(progress)
                }
            }
            // 进度完成后的操作
            withContext(Dispatchers.Main) {
                repository.IncrBalancePotato(positionEnd)
                progressBar.setProgress(0)
            }
        }
    }
}

3. 规避内存泄漏

不管用哪种方案,都要避免持有View的强引用导致内存泄漏:

  • 使用AsyncTask时,用WeakReference包裹ProgressBar及相关View对象
  • 使用协程时,借助lifecycleScope或viewModelScope,页面销毁时会自动取消任务
额外提示

如果RecyclerView存在item复用(滚动场景),记得在onViewRecycled方法中停止当前item的进度任务,防止进度条在错误的item上继续执行。

内容的提问来源于stack exchange,提问作者Artict 11

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 15:24:54