首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

Android 多圖片並發下載:線程池 + 隊列 替代 AsyncTask 方案

     編輯:程式設計疑難解答

為什麼不用 AsyncTask?

  • Android 11 (API 30) 起 **已棄用**。
  • 串行執行(預設),多圖下載排隊慢。
  • 生命週期綁定 Activity,易洩漏。

推薦架構:ThreadPoolExecutor + BlockingQueue

public class ImageDownloader {
    private static final int CORE = 3;
    private static final int MAX = 5;
    private final ExecutorService pool = new ThreadPoolExecutor(
        CORE, MAX, 60L, TimeUnit.SECONDS,
        new LinkedBlockingQueue<>(),
        new ThreadFactoryBuilder().setNameFormat("img-dl-%d").build()
    );

    public void download(List urls, ImageCallback cb) {
        for (String url : urls) {
            pool.execute(() -> {
                Bitmap bmp = downloadSync(url); // OkHttp/Glide 同步下載
                cb.onResult(url, bmp);
            });
        }
    }

    public void shutdown() { pool.shutdown(); }
}

關鍵點

  1. 有界隊列 防止 OOM(大量 URL 時拒絕新任務)。
  2. 線程命名 便於日誌追蹤。
  3. 回調主線程:new Handler(Looper.getMainLooper()).post(() -> cb.onResult(...)) 更新 UI。
  4. 取消機制:保存 Future,Activity.onDestroy 時 future.cancel(true)。

對比表

方案並發控制生命週期維護狀態
AsyncTask差(串行/固定並發)綁定 Activity棄用
ThreadPool + Queue強(可配置核心/最大/隊列)手動管理推薦
RxJava / Coroutines強(背壓/切換線程)Lifecycle 感知現代首選

現代寫法:Kotlin 協程 + Coil/Glide

scope.launch {
    urls.map { url -> async { imageLoader.get(url) } }.awaitAll()
}

拋棄 AsyncTask,**線程池 + 隊列** 或 **協程** 才是 Android 多圖下載的正規軍!

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved