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

Android 迴圈中大量啟動 AsyncTask 導致 RejectedExecutionError 解決方案

     編輯:程式設計綜合問答

問題成因

AsyncTask 內部使用固定大小的執行緒池(核心 5、最大 128、隊列 10)。在迴圈中大量 new MyAsyncTask().execute() 會迅速填滿隊列,超過 128 並發時拋出 RejectedExecutionException。

解決策略

方案一:API 11+ 使用 executeOnExecutor 自定義執行緒池

Executor customExecutor = new ThreadPoolExecutor(
    10, 50, 60L, TimeUnit.SECONDS,
    new LinkedBlockingQueue<Runnable>()
);
for (Person p : contacts) {
    new MyAsyncTask(queryString, callback).executeOnExecutor(customExecutor);
}

方案二:舊版 API 改用 ThreadPoolExecutor + runOnUiThread

ThreadPoolExecutor executor = new ThreadPoolExecutor(
    5, 20, 10L, TimeUnit.SECONDS,
    new LinkedBlockingQueue<Runnable>()
);
for (Person p : contacts) {
    executor.execute(() -> {
        String result = networkRequest(queryString);
        runOnUiThread(() -> updateUI(result));
    });
}

方案三:採用現代架構(建議)

  • Kotlin Coroutines + Dispatchers.IO 非阻塞並發。
  • RxJava / Flow 背壓控制。
  • WorkManager 適用於可延遲、需保證執行的背景工作。

最佳實務

  1. 避免在迴圈中無限制建立任務,使用批次大小控制。
  2. 統一管理執行緒池生命週期,防止記憶體洩漏。
  3. 網路請求優先考慮 OkHttp + 協程,棄用 AsyncTask(已棄用)。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved