4

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

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

活动开始,并且每当异步任务应该开始运行时,它都会这样做。onPrexecute() 被调用、执行和结束。然后调用 doInBackground() 并执行此操作,但是,就在执行该方法时,用户按下主页按钮并从最近的应用程序中滑动应用程序。(这当然会导致应用程序终止,并且所有 onDestroy 方法都被调用活动活动..(如果我在这个问题上错了,请纠正我))。

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

我的问题是:

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

4 回答 4

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

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

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

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

于 2013-10-28T19:39:59.030 回答
1
  1. 当用户按下“主页”时,您的 Activtiy 将暂停,但 doInBackground 不会,但可能会或可能不会在系统感觉需要时被系统终止。Activity 的 onPause 将被调用。您的 Asynctask doInBackGround 不会停止。它将继续运行,直到系统终止您的 App 进程。
  2. 是的,数据库操作可能需要很长时间。建议放入 doInBackground ,因为它在另一个线程上运行。onpre/onpostexcute 在主线程上运行。如果您担心 System 可能会在您的数据库操作中途终止,您可以设置 Transcation,并且只有在您完成后,您才调用 commit。

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

于 2013-10-28T19:29:33.237 回答
1
  1. 不,它不会停止。

  2. 最好将其放入某种数据存储中,然后使用它

为这样的目标使用服务总是更好。AsyncTasks 不适合这里。让您的服务人员完成这项工作,然后您可以根据需要开始或退出活动。

于 2013-10-28T19:32:37.467 回答
1

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

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

于 2017-03-21T16:29:05.963 回答