当执行它的Activity ...消失时,Android AsyncTask会返回

时间:2012-12-19 01:40:01

标签: android

以下是该方案:

  • 活动“A”创建并执行AsyncTask“T”
  • 当“T”在后台运行时,用户离开“A”
    • 用户如何离开“A”的示例:
      • 按“go”并启动Intent启动活动“B”(在我的应用中最常见)
      • 按“后退”按钮(在我的应用中也很常见)
      • 旋转屏幕,没有android:configChanges =“orientation | keyboardHidden”
  • “T”完成了它的工作并返回,试图在“A”上调用“F”函数来更新“A”的用户界面,但“A”是......“已经消失了”?!

如何确保上述内容不“炸弹”?

2 个答案:

答案 0 :(得分:1)

Android开发中一个非常常见的障碍。当我第一次偶然发现这个问题时,我发现这个Q有很多很好的讨论,为我提供了很多东西:

Is AsyncTask really conceptually flawed or am I just missing something?

AsyncTask的作者必须确保它的孤立完成是“安全的”或者取消/中止。传统的观点是从Activity的onPause或onDestroy中取消(或者至少在逻辑上通过自己滚动的某种机制,如@iagreen建议的那样分离)Task实例。

Ideal way to cancel an executing AsyncTask

Android团队成员经常围绕网络进行指导,AsyncTask旨在用于生命周期与其父活动的“预期”生命周期非常匹配的简短操作,因此如果您发现自己正在进行长期运营并且必须恢复部分您可能希望查看显式线程管理或编写服务等的进度等等:

http://developer.android.com/reference/android/app/Service.html

答案 1 :(得分:1)

主要问题是'AsyncTask通常被定义为Activity的非静态内部类。这意味着它拥有对Activity的引用。如果您的Activity因任何原因被销毁或销毁并重新创建,则您的AsyncTask仍然会引用您的“旧”Activity。由于该活动不再附加到UI,因此如果您尝试修改和UI组件,则会出现异常。

一个选项是在onStop()中设置Activity的状态 - 有一个布尔变量来指示进程是否已停止。在更新UI之前检查一下。