App终止时停止异步任务(调用onDestroyed)

时间:2013-10-28 19:22:38

标签: android android-asynctask

我有一项活动,我使用asyctask的子类与后端服务器进行服务器同步。

鉴于这是一项网络任务,可能需要几秒钟。我担心会发生以下情况。

活动开始,每当asynctask开始运行时,它就会这样做。 onPrexecute()被调用,执行和结束。比doInBackground()被调用,并且这样做,但是,正好在执行该方法时,用户按下主页按钮并从最近的APPS中滑动应用程序。 (这个当然导致应用程序终止,所有的onDestroy方法都被调用了活着的活动..(纠正我,如果我错了))。

在我的onPostExecute()方法中,我将数据插入数据库并更新VIEW。 但是,由于应用程序被“终止”,onPostExecute()方法永远不会运行。

我的问题是:

  1. 当用户按下主页按钮并离开应用程序并滑动应用程序时,doInBackground在那一刻停止了吗?也就是说,它是在中间切割而不是继续它的作用?
  2. 我将从服务器获取并放入数据库的数据会发生什么变化?是否建议将数据放入doInBackground中的数据库?

4 个答案:

答案 0 :(得分:3)

  1. AsyncTask是一个后台任务,即使关闭应用程序并调用onDestroy(),它也会继续运行。问题是当任务进入onPostExecute()并尝试更新与其绑定的活动相关联的任何视图时,因为该活动不再存在。如果你担心这一点,我做的一件事就是在调用活动中保持对AsyncTask的引用,然后调用方法myAsyncTaskReference。cancel(true)onDestroy()中取消它呼叫活动。

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

  3. 您是否考虑过使用此类服务​​?我强烈推荐IntentService,它是服务的子类,专门用于在后台执行单个任务(类似于AsyncTask),然后在完成后自行终止。它很容易实现,通常只涉及覆盖一个方法 - onHandleIntent() - 在服务启动时调用。

    它可以处理所有数据库操作,并且它没有引用活动,因此您在#1中担心的问题永远不会发生。如果您需要更新视图,您可以让IntentService在完成后生成广播,并且您的活动可以注册该广播并在收到它时相应地更新它的视图。如果你的活动不再在广播发送之后,那么它就没关系,也没有什么会失败。

答案 1 :(得分:1)

  1. 当用户按下“Home”时,您的Activtiy将暂停,但doInBackground将不会,但系统感觉可能会或可能不会终止系统。将调用Activity的onPause。你的Asynctask doInBackGround不会停止。它将继续运行,直到系统终止您的App流程。
  2. 是的,Db操作可能需要很长时间。建议放入doInBackground,因为它在另一个Thread上运行。 onpre / onpostexcute在主线程上运行。如果您担心系统可能会终止数据库操作的一半,那么您需要设置Transcation,并且只有在完成后才会调用commit。
  3. 查看此post,我已对其进行了测试。

答案 2 :(得分:1)

  1. 不,它不会停止。

  2. 将它放到某种类型的数据存储中然后再使用它会更好吗

  3. 为这些目标使用服务总是更好。 AsyncTasks不适合这里。请您的服务人员完成工作,然后您可以按照自己的意愿开始或退出活动。

答案 3 :(得分:1)

如果从最近的堆栈中滑动应用程序,它相当于关闭应用程序,因此它将终止与该进程相关的所有任务,因此异步任务也将被android系统杀死。 (甚至意图服务也被杀死)

它也取决于设备。制造商定制从最近的行为中删除应用程序