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(); }
}
new Handler(Looper.getMainLooper()).post(() -> cb.onResult(...)) 更新 UI。Future,Activity.onDestroy 時 future.cancel(true)。| 方案 | 並發控制 | 生命週期 | 維護狀態 |
|---|---|---|---|
| AsyncTask | 差(串行/固定並發) | 綁定 Activity | 棄用 |
| ThreadPool + Queue | 強(可配置核心/最大/隊列) | 手動管理 | 推薦 |
| RxJava / Coroutines | 強(背壓/切換線程) | Lifecycle 感知 | 現代首選 |
scope.launch {
urls.map { url -> async { imageLoader.get(url) } }.awaitAll()
}
拋棄 AsyncTask,**線程池 + 隊列** 或 **協程** 才是 Android 多圖下載的正規軍!