2011-05-16 62 views
0

問題是:Android AsyncTask封鎖後退密鑰事件

我的活動在onStart()中啓動AsyncTask。 在doInBackground方法我做一個簡短的WebRequest,並根據您的網絡引黃,這可能需要一點點,所以我想這個任務取消...

但..

搜索後幾個小時,測試我現在注意到調試,當用戶在doInBackground方法期間按下後退按鈕時,在我的doInBackground方法完成後,總是調度Keyevent。

所以我不必奇怪,爲什麼asynctask永遠不會被取消,當用戶按下後退, AsyncTask.cancel(真)被調用太晚.....(即使我不確定是否取消真的)將有所幫助)

那麼這是正常的行爲與asynctask和後退?

這是不正常的,因爲用戶應該如何從緩慢連接的活動回來?

等待超時?

我乞求幫助,取消一個異步的WebRequest應當可以:)

+0

也許向我們展示調用AsyncTask.cancel的代碼。 – 2011-05-16 21:02:35

+0

wouldnt幫助,因爲代碼執行的方式太晚了。 – VinoRosso 2011-05-17 09:05:34

回答

1

當用戶在doInBackground方法中按下後退按鈕時,在我的doInBackground方法完成後,總是調度Keyevent。

不,這是不正確的。

如果當我的主Activity(從我的服務器上下載文件)中運行AsyncTask時,我在設備上點擊BACK按鈕,活動立即關閉。

然而,AsyncTask會繼續運行其doInBackground()方法中的任何代碼,除非我明確地取消它(但您已知道)。

據我所知,你的「的WebRequest」(不管這可能是)阻止你的doInBackground()方法正因爲如此,任何試圖取消在onPause()onStoponDestroy()等行不通。

正如advantej指出的那樣,AsyncTask.cancel(...)方法的工作方式是它會導致isCancelled設置爲'true'。爲了成功取消AsyncTask的doInBackground()方法,您需要定期檢查isCancelled。例如...

@Override 
protected Void doInBackground(String... params) { 

    while (!isCancelled) { 
     DoSomething(); 
    } 
} 

的問題是,如果DoSomething()(例如你「的WebRequest」)擋住了while環路,則isCancelled將不檢查,直到它完成。

+0

問題是後面的KEYEVENT按鈕沒有調度,直到doInBackground方法結束。我沒有調試它,我可以看到它在日誌中,而doInBackground運行日誌說:「等待派遣關鍵事件」這不能是正常的,即時通訊絕望。它與在活動的onStart()方法中啓動Asynctask有關。但我必須在某處啓動AsyncTask ..... – VinoRosso 2011-05-17 08:48:42

+0

@VinoRosso:「等待調度關鍵事件」...創建日誌條目的位置在哪裏?在哪裏(在你的代碼中)你在等待'趕上'BACK按鈕事件? – Squonk 2011-05-17 09:09:44

+0

這個日誌條目來自android操作系統,當我按下後退按鈕和doInBackground正在運行。在我的代碼中,我捕獲了onKeyDown中的後退按鈕事件。但是這個事件來得太晚了。 – VinoRosso 2011-05-17 09:12:59

0

這是預期的行爲。該文件說:

取消任務

任務可以在任何時候取消了 調用取消(布爾)。調用 這種方法將導致後續的 調用isCancelled()返回true。 調用此方法後, onCancelled(Object),而不是 onPostExecute(Object)將在doInBackground(Object []) 返回後調用 。爲了確保任務 儘快取消,您 應經常檢查isCancelled()定期從 doInBackground(對象[])的返回值 ,如果可能的話 (例如一個循環中。)