我AsyncTask
工作,我不知道爲什麼我應該使用onPostExecute()
的參數,當我可以只使用一個類級別的實例變量在我AsyncTask
類doInBackground()
之間共享數據onPostExecute()
。AsyncTask.onPostExecute()的參數VS實例變量
這兩個工作,但有沒有任何親和騙局的每種方法?
編輯:當我說'實例變量'時,我正在談論AsyncTask
擴展類中的一個私有實例變量。當班級死亡時,實例變量也會死亡。
我AsyncTask
工作,我不知道爲什麼我應該使用onPostExecute()
的參數,當我可以只使用一個類級別的實例變量在我AsyncTask
類doInBackground()
之間共享數據onPostExecute()
。AsyncTask.onPostExecute()的參數VS實例變量
這兩個工作,但有沒有任何親和騙局的每種方法?
編輯:當我說'實例變量'時,我正在談論AsyncTask
擴展類中的一個私有實例變量。當班級死亡時,實例變量也會死亡。
那麼,它可能會降低內存泄漏的可能性,因爲您沒有在類級別保存對對象的引用,而只有那些AsyncTask方法。
它也將消除同步問題,因爲@nico_ekito提到
我同意@ a.ch。而且它對線程安全也更好。 –
我認爲這個答覆是有效的。但是,只有'AsyncTask'纔會有對實例變量的引用。我沒有看到內存泄漏輕鬆。因爲'doInBackground()'和'OnPostExecute()'是同步調用的,所以當調用'OnPostExcetute()'時(如果這是可能的話),JVM仍然不能很好地處理實例變量。 –
除了其他原因公佈;如果您在doInBackground()
中遇到異常,則只需將代表錯誤的參數傳遞給onPostExecute()
並取消任何其他工作,而不必在發現所有變量都沒有正確實例化時再發生異常。
我想你應該使用'取消(布爾)'。這也會跳過'onPostExecute()'。當你想工作條件爲你在'doInBackgroud()'中做的事情產生的狀態時,你必須在參數中提供狀態(醜陋的用兩個類型的信息使用相同的參數),或者設置一個實例變量像'mSuccess'(這個解決方案我在一些教程中看到)。 –
我發現在AsyncTask中使用實例變量不是線程安全的。在我的情況下,如果我在doInBackground()中捕獲和Exception,我將它設置爲我的AsyncTask的Exception實例變量。然後,我會檢查變量是否爲null或onPostExecute()(我不取消(),因爲我可能想顯示一個消息在用戶例外)。
無論如何,我不時記下我在doInBackground中發現了一個異常,但是在onPostExecute中實例變量將爲null。文檔確實說這些方法是同步調用的,所以我不能解釋爲什麼會發生這種情況,但我發現它發生了幾次。
最後,我將我的「Result」類更改爲包含異常和我想傳遞給onPostExecute的原始結果。這工作得很好。
允許我對接受的答案(和其他人)表示異議。
對於在AsyncTask中使用實例字段將值從一個回調傳遞到另一個回調,絕對沒有線程安全問題。通常這意味着將值從doInBackground()
傳遞到onPostExecute()
。 AsyncTask中的回調被保證永遠不會同時執行,所以沒有競爭條件,如果實例字段被設置在先前執行的回調中,也無法丟失實例字段或爲null。現在回答。onPostExecute()
參數的
優點:
doInBackground()
的返回值可確保doInBackground()
必須提供返回時的值,以確保它永遠不會忘記doInBackground()
和後面的回調之間:onPostExecute()
和onCancelled()
,實例字段可以用於幾個可能的目的缺點:
Pair
使用實例字段將值從doInBackground()
傳遞到onPostExecute()
的優點和缺點基本上與上述相反。
我認爲它有用的情況下,你的AsyncTask寫在一個單獨的類文件 – waqaslam
這不是重點,因爲我認爲Jop van Raaij意味着AsyncTask本身的類級別 –