通过运行AsyncTask处理方向更改

时间:2013-02-04 10:42:48

标签: java android android-activity android-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);
    }
}

2 个答案:

答案 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。