2012-06-25 114 views
15

我已將AsyncTasks用於我的應用程序,以便懶惰地下載和更新UI。Android AsyncTasks如何檢查活動是否仍在運行

現在我AsyncTasks更新UI真正簡單:

protected void onProgressUpdate(String... values) { 
     super.onProgressUpdate(values); 
     gender.setText(values[0]); 
} 

我的問題是如何檢查其性別TextView從呈現的活動,仍然是可用的?

如果沒有,我會得到一個錯誤,我的應用程序將關閉。

+0

沒有把握可以嘗試,如果(空==性別&& gender.isShown()) –

回答

25

您可以取消該活動的的onDestroy

@Override 
protected void onDestroy() { 
    asynctask.cancel(true); 
    super.onDestroy(); 
} 

您的AsyncTask並進行更改時您檢查您的AsyncTask是否已經取消(活動破壞)或不

protected void onProgressUpdate(String... values) { 
    super.onProgressUpdate(values); 
    if(!isCancelled()) { 
     gender.setText(values[0]); 
    } 
} 
+0

不錯。但是沒有保證每次都會調用破壞者。 (以下參考鏈接)。你如何應對? https://stackoverflow.com/a/4449988/3265444 – Ajji

0

不應該

if (gender) { 
    gender.setText(values[0]); 
} 

夠嗎?

+0

你服用的(空==性別)?即使如此,不僅僅這樣還不夠,還不夠, –

+1

不,這還不夠。該活動可能已完成,但性別可能仍然爲非空值,並且嘗試引用它將失敗,因爲視圖/窗口不再處於活動狀態。 – AgileYogi

1

儘管我從來沒有面對過這種情況,我會盡力回答你的問題。

在你的情況下,你需要驗證傳遞給AsyncTaskContext

您可以執行驗證

if(null!=mContext) //Activity still exist!! 
{ 
    gender.setText(values[0]); 
} 
else //Activity is destroyed 
{ 
    //Take appropriate action!! 
} 

優點進行,如果活動是由你達到這個說法的時候銷燬,你Context將自動成爲null,你可以處理的情況。

+2

這不行。因爲你堅持參考活動,它不會被忽略。它會變得無效,但異步任務將繼續參考活動。 – uthark

1

我會堅持讓你如果你的Activity沒有運行,你爲什麼不取消AsyncTask? 這將是一個更好和可行的解決方案。如果你的應用程序運行,說你從一個活動移動到另一個,那麼它不會給出錯誤AFAIK。

但是,我還是堅持要取消的AsyncTask然後找你的活動沒有運行,你可以檢查的AsyncTask運行與否,

if(task != null && task.equals(AsyncTask.Status.RUNNING)) 
task.cancel(true); 
2

嘗試

if (!isFinishing()) { 
    gender.setText(values[0]); 
} 
5

我也有類似問題 - 基本上我是在用戶銷燬碎片後在異步任務中獲得NPE。研究對堆棧溢出問題後,我採取了以下解決方案:

volatile boolean running; 

public void onActivityCreated (Bundle savedInstanceState) { 

    super.onActivityCreated(savedInstanceState); 

    running=true; 
    ... 
    } 


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

    running=false; 
    ... 
} 

然後,我檢查「是否運行」定期在我的異步代碼。我有壓力測試了這一點,現在我無法「打破」我的活動。這完美地工作,並且比我在SO上看到的一些解決方案更簡單。

+0

非常感謝!我最終會讓它工作! – sshashank124

+1

這很簡單,真的很有意義:)如果有人想着'volatile'關鍵字,請閱讀:http://stackoverflow.com/a/107040/4331787 –

1

Android開發者提出一個培訓this部分,保持一個WeakReference需要任務已經完成,並檢查引用null使用它之前之後進行更新UI元素。這不僅有助於檢查用戶界面是否仍然存在,還可以防止用戶界面元素被垃圾收集。

1

檢查活動是否正在運行或不

if (!isFinishing()) { 
    // Do whatever you want to do 
} 
相關問題