【发布时间】:2013-02-04 10:42:47
【问题描述】:
用例:
用户启动将加载验证码的应用。用户填写验证码并尝试下载一些信息。
问题:
如果用户在下载时旋转设备,Activity 将被销毁。在执行结束时,AsyncTask 正在尝试更新已销毁的 Activity,而 结果 是 “未附加到窗口管理器的视图”。
“错误”解决方案:
我可以用android:configChanges="orientation|keyboardHidden|screenSize" 掩盖问题,但这样布局不会更新为横向。
我在问什么:
是否可以更改方向并更改传递给AsyncTask的上下文的“参考”?
这个answer 建议检查对话框是否不为空,但这不是我要找的。p>
Here 他建议使用 WeakReference(here 一个很好的关于如何使用它的 sn-p)但我不明白它是否是我要找的。p>
更明确地说,这是我在 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);
}
}
【问题讨论】:
-
这不是最佳答案,但您可以在 asyncTask 上保留一个 ref 并将其传递给您的横向活动。然后景观活动将更新 asynctask 上下文...但我不知道如果您的 ascncTask 在活动转换期间完成会发生什么(但有针对此问题的简单解决方案)。
-
@matiash:不需要投票,因为如果您查看发布答案的时间,那是在 Alex 发布这个之后!所以当时我的问题没有一个好的答案。显然,您可以将其标记为重复,但否决意味着缺乏研究,我猜不是我的情况。只是我的两分钱。
-
@Enrichman 我没有投反对票。我同意这是一个很好的问题,它只是一个重复的问题。
-
@matiash 是的,没问题,我还以为是你,因为国旗。 :)
标签: java android android-activity android-asynctask