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

标签 android android-asynctask

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

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

Activity 开始,每当 asynctask 应该开始运行时,它就会这样做。 onPrexecute() 被调用、执行并结束。然而,调用 doInBackground() 并完成后,就在执行该方法时,用户按下主页按钮并从最近的应用程序中滑动应用程序。 (这当然会导致应用程序终止,并且所有 onDestroy 方法都会调用 Activity Activity ..(如果我在这方面有误,请纠正我))。

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

我的问题是:

  1. 当用户按下主页按钮并退出应用程序并滑动应用程序时,doInBackground 是否在此时停止?也就是说,它在中间被切断并且不会继续它的作用?
  2. 我要从服务器获取并放入数据库的数据会怎样?将数据放在 doInBackground 内的数据库中是否可取?

最佳答案

  1. AsyncTask 是一个后台任务,它会继续运行,即使应用程序已关闭并调用了 onDestroy()。问题是当任务进入 onPostExecute() 并尝试更新与其绑定(bind)的 Activity 关联的任何 View 时,因为该 Activity 不再存在。如果您担心这一点,我所做的一件事是在调用 Activity 中保留对该 AsyncTask 的引用,然后调用方法 myAsyncTaskReference.cancel(true) 以在调用 Activity 的 onDestroy()

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

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

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

关于android - App 终止时异步任务停止(调用 onDestroyed),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19643340/

相关文章:

android - 网络数据包连接 Intent

android Google map API v2 不显示街道名称

android - Android N 预览版不允许到 myserver.com 的明文 HTTP 流量

java - 警报管理器未触发广播接收器

java - 使用 AsyncTask 时出现 ExceptionInInitializerError

java - 如何将上下文传递给 AsyncTask?

java - android-java 如何取消异步任务

android - 带有 fragment 的异步任务,关闭 VM 时出错

android - MonoDroid (Xamarin) 应用程序是否不易被盗?

android - 如何创建imageView的progressDialog onload?