在任务完成之前,Android AsyncTask / Service被杀死

时间:2015-01-19 08:53:38

标签: java android android-asynctask android-service

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

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

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

我记得在某个地方学习Service持续的时间超过AsyncTask,所以当任务被杀死时,我将数据移交给我创建的Service。它是通过

完成的
    intent.putIntegerArrayListExtra(list);

并从Service中获取数据。 Service持续时间远远超过AsyncTask(仅约4-6秒),但仍未完成。我对START_XXXX标志有一点了解,但这对于这项任务来说是不好的做法,因为他们要么将整个列表发回给自己,要么真的停止。

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

全部谢谢!

1 个答案:

答案 0 :(得分:2)

您的问题非常类似:您在自己喜欢的操作系统中打开了一个应用程序,它在后台运行,然后在其中间,用户强制关闭它。从逻辑上讲,它会停止正在进行的所有操作并停止执行,并且你可以做很多事情来中断它。

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

在Android中,你有另一种选择,它稍微强一些:你可以写一个持久的后台服务,即使你的应用程序没有运行,继续运行,但仍然无法解决{{1}的问题根据你的背景,这将是下一个逻辑问题。 (就个人而言,我会为您的任务推荐这种方法。)

您可以做的最好是为您尚未删除的每一行写一个共享首选项(这将是您在开始删除时要删除的完整行列表)。对于您删除的每一行(或一堆行),更改此首选项以从首选项中删除这些行,然后如果应用程序被中断,则在重新启动应用程序时,请阅读此首选项并继续上次停止。

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

我强烈建议您不要使用服务,因为它的持续时间比AsyncTask长。这太过于苛刻而且根本不可靠。