【发布时间】:2015-09-14 03:06:18
【问题描述】:
当网络操作在 Asynctask 中运行时,如果用户按下返回按钮并切换到另一个活动,在后台运行的 Asynctask 会发生什么?
AsyncTask 进程自动被操作系统杀死?
异步任务完成它的整个操作?
【问题讨论】:
-
奇怪的是,接受的答案没有提及如果活动已经死亡会发生什么。
当网络操作在 Asynctask 中运行时,如果用户按下返回按钮并切换到另一个活动,在后台运行的 Asynctask 会发生什么?
AsyncTask 进程自动被操作系统杀死?
异步任务完成它的整个操作?
【问题讨论】:
如果您在 Activity 中启动 AsyncTask 并旋转设备,则该 Activity 将被销毁并创建一个新实例。
类似地,如果用户导航到另一个活动,当前活动将被销毁或进入后台活动堆栈,而新活动将在前台。
但是 AsyncTask 不会死。它将继续存在,直到完成。 当它完成时,AsyncTask 不会更新新 Activity 的 UI。实际上,它会更新不再显示的活动的前一个实例。这可能会导致 java.lang.IllegalArgumentException: View not attach to window manager 类型的异常,例如,如果您使用 findViewById 来检索 Activity 中的视图。
【讨论】:
IllegalArgumentException。它总是抛出异常吗?
AsyncTask 是一个抽象的 Android 类,它帮助 Android 应用程序以有效的方式处理主 UI 线程。 AsyncTask 类允许我们执行持久的任务/后台操作并在 UI 线程上显示结果,而不会影响主线程。
1. AsyncTask 进程不会被操作系统自动杀死。 AsyncTask 进程在后台运行,在任何情况下都负责完成它自己的工作。您可以通过调用 cancel(true) 方法取消您的 AsycnTask。这将导致对 isCancelled() 的后续调用返回 true。调用此方法后,在 doInBackground() 返回后调用 onCancelled(Object) 方法而不是 onPostExecute() 方法。
2.它的操作完成后,它正在处理的后台线程被停止。 AsyncTask 有一个 onPostExecute(),一旦你的工作完成就会被调用。 doInBackground() 方法完成处理后调用此方法。 doInBackground() 的结果被传递给这个方法。
【讨论】:
AsyncTask 仍将运行并尝试在 Zombie Activity 上发布结果。最好是用户 AsyncTaskLoader。
【讨论】: