使用案例:手柄的方向变化与运行的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