2013-02-04 27 views
7

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

这不是最好的答案,但你可以保留一个ref asyncTask并将其传递给你的景观活动。然后,景观活动将更新asynctask上下文......但是我不知道如果您的ascncTask在活动转换期间完成会发生什么情况(但对此问题有简单的解决方案)。 – Xval

+0

@matiash:不需要downvote,也是因为如果你看答案发布的时间,Alex发布这个之后就是正确的!所以当时对我的问题没有很好的答案。显然你可以将它标记为重复的,但是downvote意味着缺乏研究,而不是我的情况。只是我的两分钱。 – Enrichman

+0

@Enrichman我没有倒下它。我同意这是一个很好的问题,它只是一个重复的问题。 – matiash

回答

15

这里是我的秘诀:

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

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

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

+1

我遇到了一些问题,试图实现这一点,但我想这是最好的解决方案。谢谢。 :) – Enrichman

+0

我非常喜欢这个答案。 :) – Alex

0

“错误” 的解决方案:

我能掩盖与 Android的问题:configChanges =” orientation | keyboardHidden | screenSize“,但是 这个布局不会被更新为风景。

其实它会。

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

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

您可以实现对风景和肖像模式布局或取消您对配置变化的AsyncTask。

+0

当然,我有。它将改变方向,但使用的布局是为肖像模式定义的布局。 – Enrichman

+0

我更新了答案。 – EvZ