应用程序终止时(调用onDestroyed),异步任务停止。

4
我有一个activity,在其中使用asyctask的子类与后端服务器进行服务器同步。
鉴于这是一个网络任务,可能需要几秒钟的时间。我担心出现以下情况。
活动开始时,无论何时asynctask应该开始运行,都会这样做。onPrexecute()被调用、执行并结束。然后调用doInBackground(),但是当方法被执行时,用户按下home按钮并从最近的应用程序中向右滑动应用程序。(这当然会导致应用程序终止,并调用所有已存在的活动的onDestroy方法..(如果我在这一点上错了,请纠正我))。
在我的onPostExecute()方法中,我正在将数据插入DB并更新VIEWs。但是由于应用程序被“终止”,onPostExecute()方法永远不会运行。
我的问题是:
1.当用户按下home键并退出应用程序并滑动应用程序时,doInBackground是否在那时停止?也就是说,它被切成两半,不再继续做什么? 2.我即将从服务器获取并放入DB中的数据将发生什么?是否建议在doInBackground中将数据放入db中?
4个回答

3
  1. AsyncTask是一个后台任务,即使应用程序关闭并调用onDestroy(),它仍将继续运行。问题在于当任务进入onPostExecute()并尝试更新与其绑定的活动相关联的任何视图时,由于该活动不再存在,会出现问题。如果您担心这个问题,可以在调用活动中保留对该AsyncTask的引用,然后在调用活动的onDestroy()中调用方法myAsyncTaskReference.cancel(true)来取消它。

  2. 是的,我会将DB操作放在doInBackground()方法中,因为它在后台单独线程上运行,不需要对应用程序活动的引用。

您考虑过使用服务来完成这种类型的操作吗?我强烈推荐使用IntentService,它是Service的子类,专门设计用于在后台执行单个任务(类似于AsyncTask),并在完成后自动关闭自身。它很容易实现,通常只需要覆盖一个方法-onHandleIntent(),当服务启动时就会调用它。

它可以处理所有的DB操作,并且没有对活动的引用,因此您担心的问题#1永远不会发生。如果您需要更新视图,则可以让IntentService在完成后生成广播,您的Activity可以注册该广播并在接收到广播时相应地更新其视图。如果您的活动在广播发送后不再存在,则无关紧要,也不会出现任何问题。


但是 IntentService(就像 AsyncTask 一样)不会在应用程序被杀死时停止吗?因此,它甚至无法触发广播。 - tony9099
1
不,它不会停止。IntentService与调用活动完全分离,因此即使启动它的应用程序被杀死,它也将继续运行直到完成其任务。这就是为什么它非常适合DB操作,因为它仍将把接收到的所有数据写入DB。广播只是发送通知给调用活动,告知服务已完成并且应该更新其视图 - 因此,如果活动不再运行,则无论如何都没有关系。 - physphil
不,看我回答中的链接。我已经测试过了。 - wtsang02
1
这是一个不错的教程,介绍了如何实现IntentService并在完成后发送广播 - http://mobile.tutsplus.com/tutorials/android/android-fundamentals-intentservice-basics/ - physphil

1
如果从最近使用的应用中滑动关闭该应用程序,则相当于关闭该应用程序,因此将终止与该进程相关的所有任务,因此异步任务也将被Android系统杀死。(即使是Intent Service也会被杀死)这也与设备有关。制造商定制了从最近使用的应用程序中删除应用程序的行为。

1
  1. 当用户按下“主页”按钮时,您的Activity将暂停,但是doInBackground不会,但可能会在系统感觉合适时终止。Activity的onPause将被调用。您的Asynctask doInBackGround将不会停止。它将继续运行,直到系统杀死您的应用程序进程。
  2. 是的,数据库操作可能需要很长时间。建议将其放在doInBackground中,因为它在另一个线程上运行。onpre/onpostexcute在主线程上运行。如果您担心系统可能在您的db操作进行到一半时终止,您应该设置事务,并且只有在完成后才调用提交。

查看这个帖子,我已经测试过了。


1
  1. 不,它不会停止。

  2. 最好将其放入某种数据存储中,然后再处理它。

对于这样的目标,始终最好使用服务。AsyncTasks 在这里并不适用。请请求您的服务来完成工作,然后您可以根据需要启动或退出活动。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接