2013-10-28 68 views
4

我有一个活动,在该活动中,我使用asyctask的子类与服务器同步后端服务器。异步任务在App终止时停止(onDestroyed被调用)

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

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

在我的onPostExecute()方法中,我将数据插入到数据库并更新视图。 但是由于应用程序'终止',onPostExecute()方法从不运行。

我的问题是:

  1. 当用户按下home键,并得到了应用,并挥笔应用,是doInBackground停止在那一刻?也就是说,它在中间被切断,不会继续它的作用?
  2. 我将从服务器获取并放入数据库的数据会发生什么?建议将数据放入doInBackground中的数据库中吗?

回答

1
  1. 当用户按下“家”,你Activtiy将暂停,但doInBackground不会,但可能会在系统感觉就像是或可能不会被系统终止。活动的onPause将被调用。你的Asynctask doInBackGround不会停止。它将继续运行,直到系统终止您的应用程序进程。
  2. 是的,Db操作可能需要很长时间。建议放入doInBackground,因为它在另一个线程上运行。 onpre/onpostexcute在主线程上运行。如果您担心系统可能会终止您的数据库操作的一半,您应该设置Transcation,并且只有当您完成时,才调用commit。

看看这个post,我测试过了。

1
  1. 不,它不停止。

  2. 这是relly更好地把它放到数据存储某种然后用它

工作,它始终是更好地为这些目标使用的服务。 AsyncTasks在这里不适合。请您的服务部门完成这项工作,然后您可以按照您的意愿启动或退出活动。

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

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

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

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

+0

但不会IntentService(就像asynctask),只要应用程序被杀死,就停止,所以它不会甚至能够发射广播。 – tony9099

+1

不,不会停止。 IntentService与调用活动完全分离,所以它将继续运行,直到它完成任务,即使启动它的应用程序被终止。这就是为什么它对于数据库操作来说非常完美,因为它仍然会将所有接收到的数据写入数据库。发送广播只是为了通知调用活动服务已完成,并且应该更新它的视图 - 所以如果活动不再运行,则无论如何不重要。 – physphil

+0

编号请参阅我答案中的链接。我已经测试过了。 – wtsang02

1

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

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