我有一個宿主片段的活動。按下按鈕通過FragmentTransaction從片段A轉到片段B,並將其添加到後端堆棧。現在片段B有一個AsyncTask實現,它從SD卡加載圖像並在加載圖像時發佈它。如果我按下後退按鈕,我的應用程序崩潰。 。錯誤報告表明異步任務是問題,因爲當按下「後退」按鈕時它仍然在加載,所以我的問題是,我怎樣才能停止AsyncTask,當後退按鈕被按下以返回到先前片段/活動?..謝謝。當按下後退按鈕時停止片段中的AsyncTask
回答
覆蓋您的片段的onStop()和做:
protected void onStop() {
super.onStop();
//check the state of the task
if(task != null && task.getStatus() == Status.RUNNING)
task.cancel(true);
}
只需撥打這個代碼在你的主機活動的onBackPressed() - 方法 - 通過同樣適用onDestroy()一個片段:
if(myFancyAsyncTask != null && myFancyAsyncTask.getStatus() == Status.RUNNING) {
myFancyAsyncTask.cancel(true);
}
這將爲您取消正在運行的AsyncTask。一定要檢查回到的AsyncTask如果不使用生命週期的方法取消:
protected void onPostExecute(Long result) {
if(!isCancelled()) {
// do your work
}
}
我強烈建議你看片段this生命週期,以避免將來混淆。而在你的情況下,我認爲你應該重寫onPause方法頂部的asyncTask。
@Override
protected void onPause() {
super.onPause();
//check the state of the task
if(task != null && task.getStatus() == Status.RUNNING)
task.cancel(true);
}
AsyncTaskRunner doAsynchronousTask; //Before onCreateView
//in onCreateView()
doAsynchronousTask = new AsyncTaskRunner();``
doAsynchronousTask.execute();
// after onCreateView()
@Override
public void onStop() {
super.onStop();
doAsynchronousTask.cancel(true);
}
我認爲如果你給你的答案添加一個解釋會更好,這樣會更容易理解。 – Keale 2014-10-22 07:48:28
全局聲明AsyncTask方法。在oncreatview()或onActivityCreated()方法中執行這個異步任務。然後,最後複製onStop()方法 – 2014-10-22 08:05:59
的取消的onStop中的AsyncTask()是不是一個很好的選擇,因爲它可以在場景中,你會希望它繼續運行停止的AsyncTask。想象一下,你有一個片段/活動,你可以顯示從網上下載的幾張圖片,點擊圖片應該讓用戶看到另一個圖片特定的應用。這會讓你的片段擊中onStop()並取消你的AsyncTask,即使當用戶回到活動時仍然有可能要下載的圖像。我認爲在onDestroy()中做它是一個更好的選擇。
@Override
public void onDestroy() {
super.onDestroy();
if(doTask != null){
doTask.cancel(true);
}
}
- 1. 按下退出按鈕後停止GPS
- 2. 每當我按下後退按鈕時,應用程序停止
- 3. 當後退按鈕按下時重新啓動片段類
- 4. 應用按後退按鈕當按下後退按鈕
- 5. 取消的AsyncTask當用戶按下後退按鈕
- 6. 按下後退按鈕時清除片段內容
- 7. AsyncTask按下後退按鈕時的任務
- 8. 覆蓋片段中的後退按鈕
- 9. 覆蓋片段中的後退按鈕
- 10. 當瀏覽器停止按鈕或ESC按下時停止JS
- 11. AngularJS當用戶按下後退按鈕
- 12. 如何在片段上實現後退按鈕按下設備
- 13. 後退按鈕觸發意外停止
- 14. 在移動Safari中按下後退按鈕後,Javascript停止在iframe中執行
- 15. Android:在asynctask中處理後退按鈕
- 16. 如何在按下後退按鈕時停止正在播放的音頻?
- 17. 獲取FragmentTagManger中後退按鈕事件的當前片段
- 18. 按下後退按鈕時傳遞BOOL
- 19. 片段:當按下後退按鈕及定製該回調調用
- 20. 片段後退按鈕代碼更改
- 21. 按下按鈕時停止聲音iOS
- 22. 按下按鈕時退出片段或活動
- 23. 片段後退按鈕按下,然後按兩次以關閉應用程序
- 24. 當我按下我的第一個片段上的後退按鈕時,應用程序應退出
- 25. 取消與後退按鈕的asynctask
- 26. 如何在按下後退按鈕時取消或停止線程?
- 27. Android片段後退按
- 28. DispatchSource.makeTimerSource當按下後退按鈕時崩潰應用程序Swift
- 29. 當按下後退按鈕時,onStop()沒有被調用
- 30. 當我按下後退按鈕時,如何保持CountDownTimer運行
你的意思是在包含的AsyncTask吧?片段.. – irobotxxx 2012-07-06 09:41:54
是的,片段... – Nermeen 2012-07-06 09:45:44
感謝它的作品! – irobotxxx 2012-07-06 09:55:24