【问题标题】:What happens to running AsyncTasks when the Activity changes?当 Activity 发生变化时,运行 AsyncTasks 会发生什么?
【发布时间】:2015-09-14 03:06:18
【问题描述】:

当网络操作在 Asynctask 中运行时,如果用户按下返回按钮并切换到另一个活动,在后台运行的 Asynctask 会发生什么?

  1. AsyncTask 进程自动被操作系统杀死?

  2. 异步任务完成它的整个操作?

【问题讨论】:

  • 奇怪的是,接受的答案没有提及如果活动已经死亡会发生什么。

标签: android android-asynctask


【解决方案1】:

如果您在 Activity 中启动 AsyncTask 并旋转设备,则该 Activity 将被销毁并创建一个新实例。

类似地,如果用户导航到另一个活动,当前活动将被销毁或进入后台活动堆栈,而新活动将在前台。

但是 AsyncTask 不会死。它将继续存在,直到完成。 当它完成时,AsyncTask 不会更新新 Activity 的 UI。实际上,它会更新不再显示的活动的前一个实例。这可能会导致 java.lang.IllegalArgumentException: View not attach to window manager 类型的异常,例如,如果您使用 findViewById 来检索 Activity 中的视图。

【讨论】:

  • "当它完成时,AsyncTask 不会更新新 Activity 的 UI。实际上它会更新不再显示的 Activity 的前一个实例" - 如果新 Activity 是短暂的,如何让活动的旧实例保持活动状态?
  • @JaydevKalivarapu 在开始新活动时不要从旧活动中调用完成。
  • 在这种情况下,当我使用 Intent 切换回旧活动时,我会使用现有实例本身?
  • @GiruBhai 但实际上我没有得到IllegalArgumentException。它总是抛出异常吗?
  • @MahendranSakkarai 可能已经完成了。
【解决方案2】:

AsyncTask 是一个抽象的 Android 类,它帮助 Android 应用程序以有效的方式处理主 UI 线程。 AsyncTask 类允许我们执行持久的任务/后台操作并在 UI 线程上显示结果,而不会影响主线程。

1. AsyncTask 进程不会被操作系统自动杀死。 AsyncTask 进程在后台运行,在任何情况下都负责完成它自己的工作。您可以通过调用 cancel(true) 方法取消您的 AsycnTask。这将导致对 isCancelled() 的后续调用返回 true。调用此方法后,在 doInBackground() 返回后调用 onCancelled(Object) 方法而不是 onPostExecute() 方法。

2.它的操作完成后,它正在处理的后台线程被停止。 AsyncTask 有一个 onPostExecute(),一旦你的工作完成就会被调用。 doInBackground() 方法完成处理后调用此方法。 doInBackground() 的结果被传递给这个方法。

【讨论】:

  • 但是为了澄清,如果我们调用 cancel(true) 异步任务的 doInBackground() 会继续运行直到它完成是吗?
【解决方案3】:

AsyncTask 仍将运行并尝试在 Zombie Activity 上发布结果。最好是用户 AsyncTaskLoader。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-11-09
    • 1970-01-01
    • 2017-05-09
    • 2019-05-23
    • 1970-01-01
    • 2018-07-31
    • 1970-01-01
    相关资源
    最近更新 更多