2017-05-14 100 views
0

我通過3三個平行的AsyncTask下載三個平行的JSON對象:多的AsyncTask - 我怎麼知道它是哪一個「onPostExecute」

  dictAsync1Task = new DictAsyncTask(DictionaryLookUp.this, "Jishoo"); 
      dictAsync1Task.execute(); 

      dictAsync2Task = new DictAsyncTask(DictionaryLookUp.this, "Systran"); 
      dictAsync2Task.execute(); 

      dictAsync3Task = new DictAsyncTask(DictionaryLookUp.this, "Tatoeba"); 
      dictAsync3Task.execute(); 

一旦任務完成,我想刷新我的TabLayout中有一個ListView(嘿,當我問一個問題時,我怎樣才能在命令周圍獲得那些很酷的灰色背景矩形?)。

有沒有辦法知道我目前在哪個asyncTasks的onPostExecute?即我想通過檢查我是否處於dictAsync1/2/3Task的onPostExecute狀態來通過'switch'刷新listView。

(其實我發現只要使用中的AsyncTask一個全局變量更好的解決方案,但我仍然好奇,如果有一種方法可以這樣描述我的方式),你必須使用task.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);並行執行

+0

他們都鏈接到相同的ListView? – Mercato

+0

您可以通過在嚴重口音(這些字符:'')'之間分隔標記來標記標記' – nandsito

+2

您在asynctask構造函數中傳遞一個字符串。你可以在onPostExecute中訪問它嗎?你可以用它來知道哪個asynctask跑完了 – nandsito

回答

0

如果這些異步類是靜態的,那麼您必須將回調或弱引用(以避免內存泄漏)傳遞給活動。使用onPostExecute中的類型轉發下載的數據,然後僅刷新相關的選項卡列表。

原型可以void refreshData(Object data,String type);

可以在數據傳遞不同類型的ArrayList的,因爲它的對象。您可以稍後檢查這樣

if(data != null && ((ArrayList<?>)data).size() > 0) 
    { 
     if(((ArrayList<?>)data).get(0) instanceof MyType) 
     { 
      // do stuff 
     } 
    } 

或開關類型,然後抹上data這樣mTab1Data = ((ArrayList<MyType>)data)

和檢查活動還活着。也許在異步完成之前使用退出應用程序。

+0

哦,我不知道我實際上是連續執行它們,看起來他們改變了行爲,感謝那個指針。我不確定我是否遵循其他規則,對於我來說這有點過於先進,恐怕你是否試圖在''doInBackground''和''onPostExecute'之間傳遞它,或者代碼會在哪裏? – Mairyu

+0

你可以傳遞'onPostExecute'。如果你需要在doInBackground中,那麼你必須更新可運行的ui,像'Activity.runOnUiThread(new Runnable(){})' – Qamar

相關問題