使用案例:手柄的方向變化與運行的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);
}
}
這不是最好的答案,但你可以保留一個ref asyncTask並將其傳遞給你的景觀活動。然後,景觀活動將更新asynctask上下文......但是我不知道如果您的ascncTask在活動轉換期間完成會發生什麼情況(但對此問題有簡單的解決方案)。 – Xval
@matiash:不需要downvote,也是因爲如果你看答案發布的時間,Alex發佈這個之後就是正確的!所以當時對我的問題沒有很好的答案。顯然你可以將它標記爲重複的,但是downvote意味着缺乏研究,而不是我的情況。只是我的兩分錢。 – Enrichman
@Enrichman我沒有倒下它。我同意這是一個很好的問題,它只是一個重複的問題。 – matiash