【问题标题】:Handle orientation change with running AsyncTask [duplicate]通过运行 AsyncTask 处理方向更改 [重复]
【发布时间】:2013-02-04 10:42:47
【问题描述】:

用例:

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

问题:

如果用户在下载时旋转设备,Activity 将被销毁。在执行结束时,AsyncTask 正在尝试更新已销毁的 Activity,而 结果“未附加到窗口管理器的视图”。

“错误”解决方案:

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

我在问什么:

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

这个answer 建议检查对话框是否不为空,但这不是我要找的。​​p>

Here 他建议使用 Wea​​kReference(here 一个很好的关于如何使用它的 sn-p)但我不明白它是否是我要找的。​​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);
    }
}

【问题讨论】:

  • 这不是最佳答案,但您可以在 asyncTask 上保留一个 ref 并将其传递给您的横向活动。然后景观活动将更新 asynctask 上下文...但我不知道如果您的 ascncTask 在活动转换期间完成会发生什么(但有针对此问题的简单解决方案)。
  • @matiash:不需要投票,因为如果您查看发布答案的时间,那是在 Alex 发布这个之后!所以当时我的问题没有一个好的答案。显然,您可以将其标记为重复,但否决意味着缺乏研究,我猜不是我的情况。只是我的两分钱。
  • @Enrichman 我没有投反对票。我同意这是一个很好的问题,它只是一个重复的问题。
  • @matiash 是的,没问题,我还以为是你,因为国旗。 :)

标签: java android android-activity android-asynctask


【解决方案1】:

以下是我的建议:

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

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

  • 改为使用保留的工作人员Fragment。我最近posted an article 描述了如何使用保留的Fragments 来处理配置更改。它很好地解决了在旋转变化中保留AsyncTask 的问题。您基本上需要在Fragment 中托管您的AsyncTask,在Fragment 上调用setRetainInstance(true),并通过保留的FragmentAsyncTask 的进度/结果报告回Activity

【讨论】:

  • 我在尝试实现这一点时遇到了一些问题,但我想这是最好的解决方案。谢谢。 :)
  • 我非常喜欢这个答案。 :)
【解决方案2】:

“错误”解决方案:

我可以用 android:configChanges="orientation|keyboardHidden|screenSize" 但有 这样布局不会更新为横向。

其实会的。

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

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

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

【讨论】:

  • 当然有。它会改变方向,但使用的布局是为纵向模式定义的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-21
  • 2012-03-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多