【问题标题】:Android AsyncTask returns when Activity that executed it... is goneAndroid AsyncTask 在执行它的 Activity... 消失时返回
【发布时间】:2012-12-19 01:40:01
【问题描述】:

这是场景:

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

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

【问题讨论】:

  • AsyncTask 需要完成吗?当 A 的 onPause() 被调用时,你总是可以取消它。
  • 我认为在移动到新活动时取消 AsyncTask 可以完成这项工作,但我会让@iagreen 回答这个问题。
  • 是的,取消是一种常见的方法,在很多情况下都是可以接受的。我假设您希望线程完成。

标签: android


【解决方案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 旨在用于生命周期与其父 Activity 的“预期”生命周期非常匹配的短期操作,因此,如果您发现自己在执行长时间运行的操作并且必须恢复部分操作进度等,您可能想查看显式线程管理或编码服务等:

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

【讨论】:

【解决方案2】:

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

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

【讨论】:

  • 为了完整的免责声明,大约一年前,在解决了这些确切问题后,我厌倦了AsyncTasks,并直接使用ThreadHandlers 处理后台任务.
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-22
  • 1970-01-01
  • 2017-12-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多