2012-01-24 46 views
5

AsyncTask工作,我不知道爲什麼我應該使用onPostExecute()的參數,當我可以只使用一個類級別的實例變量在我AsyncTaskdoInBackground()之間共享數據onPostExecute()AsyncTask.onPostExecute()的參數VS實例變量

這兩個工作,但有沒有任何親和騙局的每種方法?

編輯:當我說'實例變量'時,我正在談論AsyncTask擴展類中的一個私有實例變量。當班級死亡時,實例變量也會死亡。

+1

我認爲它有用的情況下,你的AsyncTask寫在一個單獨的類文件 – waqaslam

+0

這不是重點,因爲我認爲Jop van Raaij意味着AsyncTask本身的類級別 –

回答

5

那麼,它可能會降低內存泄漏的可能性,因爲您沒有在類級別保存對對象的引用,而只有那些AsyncTask方法。

它也將消除同步問題,因爲@nico_ekito提到

+1

我同意@ a.ch。而且它對線程安全也更好。 –

+0

我認爲這個答覆是有效的。但是,只有'AsyncTask'纔會有對實例變量的引用。我沒有看到內存泄漏輕鬆。因爲'doInBackground()'和'OnPostExecute()'是同步調用的,所以當調用'OnPostExcetute()'時(如果這是可能的話),JVM仍然不能很好地處理實例變量。 –

0

除了其他原因公佈;如果您在doInBackground()中遇到異常,則只需將代表錯誤的參數傳遞給onPostExecute()並取消任何其他工作,而不必在發現所有變量都沒有正確實例化時再發生異常。

+0

我想你應該使用'取消(布爾)'。這也會跳過'onPostExecute()'。當你想工作條件爲你在'doInBackgroud()'中做的事情產生的狀態時,你必須在參數中提供狀態(醜陋的用兩個類型的信息使用相同的參數),或者設置一個實例變量像'mSuccess'(這個解決方案我在一些教程中看到)。 –

1

我發現在AsyncTask中使用實例變量不是線程安全的。在我的情況下,如果我在doInBackground()中捕獲和Exception,我將它設置爲我的AsyncTask的Exception實例變量。然後,我會檢查變量是否爲null或onPostExecute()(我不取消(),因爲我可能想顯示一個消息在用戶例外)。

無論如何,我不時記下我在doInBackground中發現了一個異常,但是在onPostExecute中實例變量將爲null。文檔確實說這些方法是同步調用的,所以我不能解釋爲什麼會發生這種情況,但我發現它發生了幾次。

最後,我將我的「Result」類更改爲包含異常和我想傳遞給onPostExecute的原始結果。這工作得很好。

0

允許我對接受的答案(和其他人)表示異議。

對於在AsyncTask中使用實例字段將值從一個回調傳遞到另一個回調,絕對沒有線程安全問題。通常這意味着將值從doInBackground()傳遞到onPostExecute()。 AsyncTask中的回調被保證永遠不會同時執行,所以沒有競爭條件,如果實例字段被設置在先前執行的回調中,也無法丟失實例字段或爲null。現在回答。onPostExecute()參數的

優點:

  • 參數來源於doInBackground()的返回值可確保doInBackground()必須提供返回時的值,以確保它永遠不會忘記
  • 的參數是明確建立關係在doInBackground()和後面的回調之間:onPostExecute()onCancelled(),實例字段可以用於幾個可能的目的
參數個

缺點:

  • 它是一個單一的參數,因此你不能通過兩個或多個值,作爲一種解決方法,你可以在一個類你創造的包裹多個值或許Pair

使用實例字段將值從doInBackground()傳遞到onPostExecute()的優點和缺點基本上與上述相反。