2013-02-04 25 views
7

使用案例:手柄的方向變化與運行的AsyncTask

的用戶開始將加載驗證碼的應用程序。用戶填寫驗證碼並嘗試下載一些信息。

問題:

如果用戶在下載Activity被破壞旋轉設備。在執行結束時,AsyncTask試圖更新銷燬的Activity結果「查看未附加到窗口管理器」。

「錯誤」的解決方案:

我可以用android:configChanges="orientation|keyboardHidden|screenSize"但這種佈局是不會被更新,以景觀掩蓋了問題。

就是我要問:

是否有可能改變方向,改變傳遞給AsyncTask語境的「參考」?

answer建議檢查對話框是否不爲空,但它不是我要找的。

Here他建議使用WeakReference(here關於如何使用它的一個很好的片段),但我不明白,如果這是我正在尋找。

更明確的,這是我在onPostExecute正在做:

@Override 
protected void onPostExecute(Auto result) { 
    progress.dismiss(); 
    new DownloaderCaptcha(context).execute(""); 
    ((EditText)context.findViewById(R.id.editTextCaptcha)).setText(""); 
    context.findViewById(R.id.progrBar).setVisibility(View.VISIBLE); 
    context.findViewById(R.id.captcha).setVisibility(View.INVISIBLE); 

    if(result != null) { 
     Storage.storeHistory(context, result.getTarga().getValue()); 

     Intent i = new Intent(context, MenuActivity.class); 
     i.putExtra("result", result); 
     context.startActivity(i); 
    } else { 
     ErrorDialog.show(context, error); 
    } 
} 
+0

這不是最好的答案,但你可以保留一個ref asyncTask並將其傳遞給你的景觀活動。然後,景觀活動將更新asynctask上下文......但是我不知道如果您的ascncTask在活動轉換期間完成會發生什麼情況(但對此問題有簡單的解決方案)。 – Xval

+0

@matiash:不需要downvote,也是因爲如果你看答案發布的時間,Alex發佈這個之後就是正確的!所以當時對我的問題沒有很好的答案。顯然你可以將它標記爲重複的,但是downvote意味着缺乏研究,而不是我的情況。只是我的兩分錢。 – Enrichman

+0

@Enrichman我沒有倒下它。我同意這是一個很好的問題,它只是一個重複的問題。 – matiash

回答

15

這裏是我的祕訣:

  • 使用android:configChanges來解決這個問題。

  • 不是使用Activity#onRetainNonConfigurationInstance()來解決它(因爲這種方法已被棄用)。

  • 而是使用保留的工作人員Fragment。我最近在posted an article中描述瞭如何使用保留的Fragment來處理配置更改。它很好地解決了在旋轉變化中保留AsyncTask的問題。您基本上需要將您的AsyncTask寄存在Fragment內,在Fragment上呼叫setRetainInstance(true),並通過保留的FragmentAsyncTask的進度/結果報告回Activity

+1

我遇到了一些問題,試圖實現這一點,但我想這是最好的解決方案。謝謝。 :) – Enrichman

+0

我非常喜歡這個答案。 :) – Alex

0

「錯誤」 的解決方案:

我能掩蓋與 Android的問題:configChanges =」 orientation | keyboardHidden | screenSize「,但是 這個佈局不會被更新爲風景。

其實它會。

android:configChanges列出活動 將自行處理的配置更改。當運行時發生配置更改時, 活動默認關閉並重新啓動,但使用此屬性聲明 配置將會阻止重新啓動活動 。相反,該活動仍在運行,並調用其onConfigurationChanged()方法。

看看http://developer.android.com/guide/topics/manifest/activity-element.html#config

您可以實現對風景和肖像模式佈局或取消您對配置變化的AsyncTask。

+0

當然,我有。它將改變方向,但使用的佈局是爲肖像模式定義的佈局。 – Enrichman

+0

我更新了答案。 – EvZ