2017-07-01 76 views
0

嗨我還是比較新的android編程,我最近偶然發現了一個AsyncTasks上相當抽象的問題。AsyncTask執行後做不同的事情?

據我瞭解,在AsyncTask執行runInBackground之後,它將一個值返回給onPostExecute,它在UI中對結果進行線程處理。現在,如果我想用runInBackground返回的結果做不同的事情。我見過提出象這樣的例子(從here拍攝):

private class MyCustomAsyncTask extends AsyncTask<Void, Void, Void>{ 

    private boolean mShouldCallMethod1; 

    public MyCustomAsyncTask(boolean shouldCallMethod1){ 
     mShouldCallMethod1 = shouldCallMethod1; 
    } 

    @Override 
    protected Void doInBackground(Void... params) { 
     //code goes here.. 
     return null; 
    } 

    @Override 
    protected void onPostExecute(Void result) { 
     if(mShouldCallMethod1){ 
      method1(); 
     }else{ 
      method2(); 
     } 
    } 

} 

但是如果我想要兩個以上的東西,onPostExecute應該做的(如方法3,方法4,等什麼當然,我?可以實現一個switch和一些int變量來決定調用什麼方法等等,但這看起來很愚蠢和冗餘,函數返回一個結果的模型不管它的目的是什麼,對我來說似乎是非常直接的,然而在AsyncTask中,它似乎我必須指定一個目的,而且我想知道是否有AsyncTask可以實現類似功能的方法。

例如,我有一個AsyncTask帶有網址的圖片。並且此圖像可能用於填充ImageView,或者可能會將其保存到圖庫中。所以他們基本上在runInBackground中做了同樣的事情,但他們的結果需要以不同的方式處理。

我還是一個初學者,所以我很抱歉,如果我錯過了一些簡單的細節/概念。 預先感謝您。

+0

如果他們做不同的事情 –

+0

@ cricket_007感謝您的答覆你應該寫不同Asynctasks。是的,我曾考慮過這一點,但這意味着我必須反覆寫一堆相同的東西,這似乎也是多餘的。儘管如果沒有別的辦法,那就必須做。 –

+0

答案真的取決於你想要達到的目標,而且提供的代碼樣例太過任意。 AsyncTask將提供什麼數據作爲參數'onPostExecute'?我認爲它會是同一類型的,所以需要改變它的處理方式? – PPartisan

回答

0

如果你認爲交換機是愚蠢的,你有很好的面向對象本能。總的來說,有很好的理由避免AsyncTask。但撇開這一邊,專注於你的問題......

如果你有一堆AsyncTask s表示做同樣的事情在doInBackground但需要在onPostExecute做不同的事情,這是一個匿名子類的經典案例。首先,在您的MyCustomAsyncTask中實施doInBackground。然後在您的Activity或您需要使用它的地方聲明並使用匿名子類。

mAsyncTask = new MyCustomAsyncTask(/* constructor params */) { 
    @Override 
    protected void onPostExecute(Void result) { 
     // can access activity members here 
     mAsyncTask = null; 
    } 
}.execute();  

確保正在運行的任務是或onDestroy取消。

if(mAsyncTask != null) { 
    mAsyncTask.cancel(); 
    mAsyncTask = null; 
} 
+0

謝謝你的回答。在挖掘了很多類似的問題(可能還不夠)之後,我從未見過這個解決方案。它看起來正是我需要的! –

0

從哪裏調用asyncTask將決定您將圖片放入的用途。您將圖像返回到該點並將其用於您撥打電話的目的。

+0

感謝您的回答。愚蠢的問題:我應該如何將圖像「返回」到我稱之爲AsyncTask的原始點,它們不是在不同的線程上嗎? –

+0

這是Fencer300今天早些時候回答的,請參閱:https://stackoverflow.com/questions/44858053/confused-on-how-to-make-variable-in-class/44858357#44858357 – BusinessPlanQuickBuilder

+0

也可能有用的是我的問題比賽條件和Gabe Sechan的有用答案。請參閱https://stackoverflow.com/questions/44864075/can-doinbackground-in-an-asynctask-potentially-cause-a-race-condition – BusinessPlanQuickBuilder