当执行它的活动消失时,Android Asynctask返回



这是场景:

  • 活动" a"创建并执行异步" T"
  • 作为" t"在后台运行,用户远离" a"
    • 用户如何摆脱" A"的示例:
      • 按" go"并启动意图启动活动" b"(在我的应用中最常见)
      • 按下"回"按钮(在我的应用中也很常见)
      • 旋转屏幕,没有android:configchanges =" artirentation |键盘障碍"
      • 等。
  • " t"已经完成了工作并返回,试图在" a"上调用function" f"以更新" a" s ui,但" a" as ..."

我如何确保上述不"炸弹"?

Android开发中非常普遍的障碍。当我第一次在这个问题上偶然发现时,我发现了这个Q,其中有很多很棒的讨论,这些讨论对我阐明了:

异步在概念上确实存在缺陷,还是我只是缺少某些东西?

Asynctask的作者必须确保它的孤儿完成是"安全的",否则取消/流产。传统的观点是从您的活动的Onpause或Ondestroy中取消(至少在逻辑上通过您自己的滚动的某种机制解离)。

取消执行异步的理想方式

Android团队成员的网络经常有指导,即Asynctask旨在用于短期操作,其生命周期与其父母活动的"预期"生命周期非常匹配,因此,如果您发现自己正在做劳累的操作并必须恢复部分操作进度等您可能想查看显式线程管理或编码服务等:

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

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

一个选项是在onstop()中设置活动的状态 - 具有布尔变量指示是否停止了该过程。在更新UI之前检查一下。

最新更新