2

这是场景:

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

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

4

2 回答 2

1

Android 开发中一个非常常见的障碍。当我第一次偶然发现这个问题时,我发现这个 Q 有很多精彩的讨论,为我阐明了一些事情:

AsyncTask 真的在概念上存在缺陷还是我只是遗漏了什么?

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

取消正在执行的 AsyncTask 的理想方法

Android 团队成员在网络上经常提供指导,即 AsyncTask 旨在用于生命周期与其父活动的“预期”生命周期密切匹配的短期操作,因此,如果您发现自己在执行长时间运行的操作并且必须恢复部分进度等您可能想查看显式线程管理或对服务进行编码等:

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

于 2012-12-19T01:52:40.693 回答
1

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

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

于 2012-12-19T01:53:16.080 回答