我有一个 Activity ,其中我使用 asyctask 的子类与后端服务器进行服务器同步。
鉴于这是一项网络任务,可能需要几秒钟。我害怕发生以下情况。
Activity 开始,每当 asynctask 应该开始运行时,它就会这样做。 onPrexecute() 被调用、执行并结束。然而,调用 doInBackground() 并完成后,就在执行该方法时,用户按下主页按钮并从最近的应用程序中滑动应用程序。 (这当然会导致应用程序终止,并且所有 onDestroy 方法都会调用 Activity Activity ..(如果我在这方面有误,请纠正我))。
在我的 onPostExecute() 方法中,我将数据插入数据库并更新 View 。 但由于应用程序已“终止”,因此 onPostExecute() 方法永远不会运行。
我的问题是:
- 当用户按下主页按钮并退出应用程序并滑动应用程序时,doInBackground 是否在此时停止?也就是说,它在中间被切断并且不会继续它的作用?
- 我要从服务器获取并放入数据库的数据会怎样?将数据放在 doInBackground 内的数据库中是否可取?
最佳答案
AsyncTask 是一个后台任务,它会继续运行,即使应用程序已关闭并调用了
onDestroy()
。问题是当任务进入onPostExecute()
并尝试更新与其绑定(bind)的 Activity 关联的任何 View 时,因为该 Activity 不再存在。如果您担心这一点,我所做的一件事是在调用 Activity 中保留对该 AsyncTask 的引用,然后调用方法 myAsyncTaskReference.cancel(true)
以在调用 Activity 的onDestroy()
。是的,我会将数据库操作放在
doInBackground()
方法中,因为它在后台运行在单独的线程上,并且不需要引用应用 Activity .
您是否考虑过为此类事情使用服务?我强烈推荐 IntentService ,它是服务的一个子类,专门设计用于在后台执行单个任务(类似于 AsyncTask),然后在完成后自行终止。它很容易实现,通常只涉及覆盖一个方法 - onHandleIntent()
- 在服务启动时调用。
它可以处理您所有的数据库操作,并且它没有对 Activity 的引用,因此您在 #1 中担心的问题永远不会发生。如果您需要更新一个 View ,您可以让您的 IntentService 在它完成后生成一个广播,您的 Activity 可以注册该广播并在收到它时相应地更新它的 View 。如果发送广播后您的 Activity 不再存在,那也没关系,任何事情都不会失败。
关于android - App 终止时异步任务停止(调用 onDestroyed),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19643340/