簡體   English   中英

獲取在Android應用中執行並且當前正在運行的所有AsyncTasks

[英]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.newFixedThreadPoolExecutorService.invokeAll 您可以調用所有任務並返回所有可以控制它們的Future。 你甚至可以在一些反向線程(甚至是asynctask.doInBackground)上使用Future.get和timeout到30s,如果操作超時,則使用Future.cancel

由於任務數量未知,但他們需要以某種方式進行溝通。 我建議創建2個類:

  1. YourTask類 - 所有需要的任務都是它的實例
  2. TaskMediator - 將通信作為Mediator設計模式進行管理

因此,每當一個任務(YourTask)創建它時,它就會將自己注冊到管理其通信的預定義類(TaskMediator)

這樣你就可以在它們的對象之間獲得更松散的耦合,但仍然保持一個通信通道

*按照Marcin Jedrzejewski的建議,你的TaskMediator可以是Singleton

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM