8

用例:

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

问题:

如果用户在下载时旋转设备,Activity则会被破坏。在执行结束时,AsyncTask 试图更新被破坏Activity的对象,结果“视图未附加到窗口管理器”。

“错误”解决方案:

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

我在问什么:

是否可以更改方向并更改传递给 Context 的“参考” AsyncTask

这个答案建议检查对话框是否不为空,但这不是我要找的。

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

更明确地说,这是我在 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);
    }
}
4

2 回答 2

16

以下是我的建议:

  • 不要用来解决android:configChanges这个问题。

  • 不要使用Activity#onRetainNonConfigurationInstance()它来解决它(因为这种方法已被弃用)。

  • 相反,请使用保留的工人Fragment。我最近发布了一篇文章,描述了如何使用 reserved 处理配置更改Fragment。它很好地解决了保持AsyncTask跨旋转变化的问题。您基本上需要托管您的AsyncTask内部 a Fragment,调用setRetainInstance(true)Fragment并通过保留AsyncTask的.ActivityFragment

于 2013-04-30T16:52:00.377 回答
0

“错误”解决方案:

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

其实会的。

android:configChanges 列出活动将自行处理的配置更改。当运行时发生配置更改时,默认情况下会关闭并重新启动 Activity,但使用此属性声明配置会阻止 Activity 重新启动。相反,活动保持运行并调用其 onConfigurationChanged() 方法。

看看http://developer.android.com/guide/topics/manifest/activity-element.html#config

您可以实现横向和纵向模式的布局,或者在配置更改时取消 AsyncTask。

于 2013-02-04T10:51:49.280 回答