![](/img/trans.png)
[英]How to get the total number of AsyncTasks currently running in parallel in the thread pool?
[英]Get all AsyncTasks that are executed and currently running in Android app
我有許多AsyncTask
實例從服務器下載一些不同的內容。 他們在執行者身上運行:
final GetStationsTask getStationsTask = new GetStationsTask();
getStationsTask
.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, URL_STATIONS);
目前我有3個AsyncTask
子類,但這個數字不會保持不變。 我也正在為因各種原因未完成的任務實現某種重試,如果至少有一個任務未正確完成(未收到數據),我想從頭開始下載所有內容:
// mHandler = new Handler(); // an instance variable
mHandler.postDelayed(new Runnable() {
@Override
public void run() {
if (!allDataSet()) {
// here I want to cancel the tasks that are still running
// and rerun all of them
}
}
}, 30000); // I give all the tasks 30 seconds to complete
為此,我想我需要知道哪些任務當前正在運行,哪些任務已正確完成以及哪些任務被取消,因為如果所有任務都重新啟動,我需要先取消正在運行的任務以防止數據被多次接收。 任何想法如何解決?
覆蓋基礎AsyncTask,並將其用作所有AsyncTasks的基類。 讓覆蓋任務具有運行,已取消和已完成任務的靜態列表。 然后將每個任務添加到基類方法中的相關列表中。
您可以保留當前在某些單例類中執行的AsyncTasks列表,即。 申請延期一:
List<AsyncTask<String, String, String>> downloadsAsycs = new ArrayList<AsyncTask<String, String, String>>();
你的asynctask的onPostExecute里面使用downloadsAsycs.remove(this)
從列表中刪除它。 請記住要么使用此列表進行同步,要么始終在UI線程上修改/讀取它,即。 來自mainlooper或onPreExecute / onPostExecute的Handler。 您可以使用AsyncTask.getStatus()
檢查異步任務的狀態。 過了一會兒它開始變得復雜。
您還可以從AsyncTask切換到Executors.newFixedThreadPool和ExecutorService.invokeAll 。 您可以調用所有任務並返回所有可以控制它們的Future。 你甚至可以在一些反向線程(甚至是asynctask.doInBackground)上使用Future.get和timeout到30s,如果操作超時,則使用Future.cancel 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.