【问题标题】:Android AsyncTask/Service killed before task completeAndroid AsyncTask/Service 在任务完成之前被杀死
【发布时间】:2015-01-19 08:53:38
【问题描述】:

概要:我需要一种方法来启动一项任务,并让它在应用程序的 onDestroy() 中持续存在直到它完成,或者能够从中断的地方继续。

在我的应用程序中,我有一个 ListView 包含来自数据库的一些项目。希望只有大约 10-30 个项目,但可能有数千个(如果用户从未清除它,尽管我有时会提示清除它)。

我已经设置了一个AsyncTask,以便在用户需要时从列表中清除所选项目。但是,我注意到 AsyncTask 在调用 onDestroy() 时被杀死,例如,如果用户选择所有要删除的项目,按删除,然后在任务仍在执行时将应用程序从“最近”中滑出。

我记得在某处了解到ServiceAsyncTask 存在的时间更长,因此当任务被终止时,我将要删除的数据交给我创建的Service。它是通过

    intent.putIntegerArrayListExtra(list);

并在Service 中从中获取数据。 ServiceAsyncTask 持续的时间要长得多(只有大约 4-6 秒),但仍然没有完全完成。我对 START_XXXX 标志知之甚少,但这对于这项任务来说是不好的做法,因为它们要么将整个列表发送回自身,要么永远真正停止。

从数据库中删除选定项目而不在应用程序被终止时停止的首选方法是什么,或者至少从停止的地方继续?

谢谢大家!

【问题讨论】:

  • 你不能等到任务在你的 onDestroy() 开始时完成吗?
  • @BartHofma 这是可以接受的做法吗?如果是这样,你将如何做到这一点?谢谢
  • 我不知道这是否可以接受,我会这样做。猜猜它还取决于您正在构建的应用程序类型。如果您使用以下方式启动活动,则可以等待活动完成:(intent 是您的活动) startActivityForResult(intent,0);//完成后,onResult 方法将运行以继续

标签: java android android-asynctask android-service


【解决方案1】:

你的问题很像这样:你有一个应用程序在你最喜欢的操作系统中打开,它在后台做事,然后在它中间,用户强制关闭它。从逻辑上讲,它会停止它正在做的所有事情并停止执行,而且你无法中断它。

没有理想的解决方案来阻止这种情况的发生,因此大多数人最终会警告用户,当此操作正在进行时停止应用可能会产生不良后果。

然而,在 Android 中,您还有另一个更强大的选项:您可以编写一个持久的后台服务,即使您的应用程序没有运行,它也会继续运行,但这仍然不能解决 what happens if the user switches off the phone when you're deleting from the DB? 的问题考虑到您的上下文,将是下一个合乎逻辑的问题。 (就我个人而言,我推荐这种方法用于您的任务)。

您可以做的最好的事情是为您尚未删除的每一行编写一个共享首选项(这将是您开始删除时要删除的行的完整列表)。对于您删除的每一行(或多行),更改此首选项以从首选项中删除这些行,然后如果应用中断,当您重新启动应用时,请阅读此首选项并从中断处继续。

或者,做其他人做的事情并警告用户(例如通过使用对话框)他们不应该在删除完成之前停止应用程序,否则会发生坏事等。

我强烈建议您不要使用服务,因为它比 AsyncTask 持续时间更长。这太老套了,根本不可靠。

【讨论】:

  • 是的,也许代替 SharedPreferences,只需在您的数据库中添加一个属性“toBeDeleted”,以便在开始删除之前将行设置为 true,然后按照 Kha 的建议,当用户杀死应用程序时,您知道还有什么要删除的。所以当用户重新打开应用时,检查是否还有更多行需要删除并删除。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-06-15
  • 2017-08-07
  • 1970-01-01
相关资源
最近更新 更多