使用案例
用户启动将加载验证码的应用。用户填写验证码并尝试下载一些信息。
问题:
如果用户在下载Activity
时旋转设备,则会被销毁。在执行结束时,AsyncTask尝试更新被破坏的Activity
,而结果是“视图未附加到窗口管理器”。
“错误的”解决方案:
我可以用android:configChanges="orientation|keyboardHidden|screenSize"
掩盖问题但是这样布局不会更新为横向。
我在问什么:
是否可以更改方向并更改传递给AsyncTask
的上下文的“参考”?
这个answer建议检查对话框是否为空,但这不是我要找的。 p>
Here他建议使用WeakReference(here一个关于如何使用它的好片段)但我不明白它是否是我正在寻找的。 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);
}
}
答案 0 :(得分:16)
以下是我的提示:
不使用android:configChanges
来解决此问题。
不使用Activity#onRetainNonConfigurationInstance()
解决此问题(因为此方法已弃用)。
相反,请使用保留的工作人员Fragment
。我最近posted an article描述了如何使用保留的Fragment
来处理配置更改。它解决了在旋转变化中很好地保留AsyncTask
的问题。您基本上需要在AsyncTask
内托管Fragment
,在setRetainInstance(true)
上致电Fragment
,并将AsyncTask
的进度/结果报告给Activity
{1}}通过保留的Fragment
。
答案 1 :(得分:0)
“错误的”解决方案:
我可以用a掩盖问题 android:configChanges =“orientation | keyboardHidden | screenSize”但是有 这个布局不会更新为横向。
实际上它会。
android:configChanges列出活动的配置更改 将处理自己。当运行时发生配置更改时, 默认情况下,活动已关闭并重新启动,但声明了一个 具有此属性的配置将阻止活动 重新启动。相反,活动仍然在运行 调用onConfigurationChanged()方法。
查看http://developer.android.com/guide/topics/manifest/activity-element.html#config
您可以实现横向和纵向模式的布局,也可以在配置更改时取消AsyncTask。