2012-02-02 32 views
0

我有一個asynctask,當視圖通過onDestoryView()取消時,我取消了。這個問題是我做的「downloader.cancel(true);」它不會取消。事實上,它會返回false。目前,它引用ListAdapter向其添加項目。但是,當我將屏幕轉爲橫向時,在onPostExecute期間ListAdapter爲null。我無法弄清ListAdapter何時變爲null。我已經嘗試onDestory和onDestoryView來取消在ListAdapter變爲null之前的asynctask,但它永遠不會工作。這是一個ListFragment btw的內部。ListAdapter生命週期和屏幕旋轉取消AsyncTask

目前,我只是檢查適配器是否在asynctask中爲空,但這真的磨削我的齒輪。我寧願在ListAdapter爲空之前取消任務。

有沒有人知道ListAdapter在屏幕旋轉期間何時爲ListFragment爲空?

+0

這裏閱讀如何取消AsyncTask http://stackoverflow.com/questions/2735102/ideal-way-to-cancel-an-executing-asynctask – 2012-02-02 21:08:03

回答

1

取消AsyncTask確實不是殺死線程。您將在文檔Thread中看到像stopdestroy這樣的方法未實現。所以一旦doInBackground方法開始執行,即使任務被cancel(true)取消,它也會運行到完成狀態。您需要適當地編寫代碼。

+0

但我認爲AsyncTask同步運行一次內doInBackground?如果是這樣的話,那麼A)我們在ListAdapter == null之前觸發了doInBackground,或者B)在doInBackground之前我們取消了AsyncTask,而是在onCancelled之後取消了AsyncTask?我想我不明白AsyncTask在做什麼。 – Buttink 2012-02-03 01:25:56

0

當屏幕方向改變時,默認行爲是銷燬活動並重新創建它。所以方法OnDestroy和OnCreate將被調用。您可以取消此行爲,在活動中加入這一行,你的艙單:

機器人:configChanges =「keyboardHidden |定位」

就像是:

<activity 
     android:name=".YourActivity" 
     android:label="@string/app_name" 
     android:configChanges="keyboardHidden|orientation" > 

您還需要添加方法onConfigurationChanged在你的activity類中。

@Override 
public void onConfigurationChanged(Configuration newConfig) { 
    super.onConfigurationChanged(newConfig); // tem que ter 

    reconfiguraInterface(); 
} 

之後,方向更改時不會調用OnDestroy和OnCreate。