通过运行AsyncTask处理方向更改

Enr*_*man 8 java android android-asynctask android-activity

使用案例:

用户启动将加载验证码的应用程序.用户填写验证码并尝试下载一些信息.

问题:

如果用户在下载时旋转设备Activity则被销毁.在执行结束时,AsyncTask正在尝试更新被破坏的内容Activity,结果"View not attached to window manager".

"错误的"解决方案:

我可以用a掩盖问题,android:configChanges="orientation|keyboardHidden|screenSize"但是这样布局不会更新为横向.

我在问什么:

是否可以更改方向并更改传递给上下文的"参考" AsyncTask

这个答案建议检查对话框是否为空,但它不是我正在寻找的.

在这里,他建议使用WeakReference(这里有一个关于如何使用它的好片段),但我不明白它是否是我正在寻找的.

更明确一点,这就是我在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);
    }
}
Run Code Online (Sandbox Code Playgroud)

Ale*_*ood 16

这是我的提示:

  • 千万不能使用android:configChanges来解决这个问题.

  • 千万不能使用Activity#onRetainNonConfigurationInstance()来解决,要么(此方法已过时).

  • 相反,使用保留的工作人员Fragment.我最近发布了一篇文章,描述了如何使用retain Fragments 处理配置更改.它解决了保持AsyncTask旋转变化很好的问题.你基本上需要托管AsyncTask里面Fragment,叫setRetainInstance(true)Fragment,报告AsyncTask的进度/结果返回给它Activity通过保留Fragment.