2012-07-06 120 views
0

我有一個宿主片段的活動。按下按鈕通過FragmentTransaction從片段A轉到片段B,並將其添加到後端堆棧。現在片段B有一個AsyncTask實現,它從SD卡加載圖像並在加載圖像時發佈它。如果我按下後退按鈕,我的應用程序崩潰。 。錯誤報告表明異步任務是問題,因爲當按下「後退」按鈕時它仍然在加載,所以我的問題是,我怎樣才能停止AsyncTask,當後退按鈕被按下以返回到先前片段/活動?..謝謝。當按下後退按鈕時停止片段中的AsyncTask

回答

12

覆蓋您的片段的onStop()和做:

protected void onStop() { 
    super.onStop(); 

    //check the state of the task 
    if(task != null && task.getStatus() == Status.RUNNING) 
     task.cancel(true); 
} 
+0

你的意思是在包含的AsyncTask吧?片段.. – irobotxxx 2012-07-06 09:41:54

+0

是的,片段... – Nermeen 2012-07-06 09:45:44

+0

感謝它的作品! – irobotxxx 2012-07-06 09:55:24

2

只需撥打這個代碼在你的主機活動的onBackPressed() - 方法 - 通過同樣適用onDestroy()一個片段:

if(myFancyAsyncTask != null && myFancyAsyncTask.getStatus() == Status.RUNNING) { 
    myFancyAsyncTask.cancel(true); 
} 

這將爲您取消正在運行的AsyncTask。一定要檢查回到的AsyncTask如果不使用生命週期的方法取消:

protected void onPostExecute(Long result) { 
    if(!isCancelled()) { 
     // do your work 
    } 
} 
2

我強烈建議你看片段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); 
} 
1
AsyncTaskRunner doAsynchronousTask; //Before onCreateView 

//in onCreateView() 
    doAsynchronousTask = new AsyncTaskRunner();`` 
    doAsynchronousTask.execute(); 


// after onCreateView() 
    @Override 
    public void onStop() { 
     super.onStop(); 
     doAsynchronousTask.cancel(true); 
    } 
+0

我認爲如果你給你的答案添加一個解釋會更好,這樣會更容易理解。 – Keale 2014-10-22 07:48:28

+0

全局聲明AsyncTask方法。在oncreatview()或onActivityCreated()方法中執行這個異步任務。然後,最後複製onStop()方法 – 2014-10-22 08:05:59

2

的取消的onStop中的AsyncTask()是不是一個很好的選擇,因爲它可以在場景中,你會希望它繼續運行停止的AsyncTask。想象一下,你有一個片段/活動,你可以顯示從網上下載的幾張圖片,點擊圖片應該讓用戶看到另一個圖片特定的應用。這會讓你的片段擊中onStop()並取消你的AsyncTask,即使當用戶回到活動時仍然有可能要下載的圖像。我認爲在onDestroy()中做它是一個更好的選擇。

@Override 
public void onDestroy() { 
    super.onDestroy(); 

    if(doTask != null){ 
     doTask.cancel(true); 
    } 
} 
相關問題