2012-02-26 102 views
2

我在几个地方使用AsyncTasks来执行冗长的数据库查询,然后在PostExecute中填充生成的数据视图。但到了那个时候,用户可以在我的应用程序中切换屏幕(片段),甚至将应用程序“退出”回发射器。Android:活动结束时AsyncTask的最佳实践

现在我使用一种有点kludgey的方法,以便AsyncTask可以在进行更新之前检查活动是否仍然存在。但这真的有必要吗?看起来只要任务处于活动状态,即各种View对象仍然存在,因此更新它们虽然无用,但不会损害任何内容。

任何人都有一些协调AsyncTasks在这方面的行动的想法?

回答

2

保持对已结束活动的引用可能会导致严重的内存问题,因为它会阻止与该活动关联的所有内容都被刷新。这个问题上Android开发者小组有一个有趣的线索;我认为最有用的帖子是here

另请参阅this thread了解更多关于AsyncTask中的缺陷以及如何处理它们的信息。

编辑:还有Santiago Lezica的this useful blog post这是特定于使用AsyncTask与片段,称为setRetainInstance(true);

+0

这几乎总结一下我已经运行到并断定关于使用AsyncTasks的陷阱。谢谢你的提示! – gordonwd 2012-02-28 15:55:50

0

由于您的后台任务几乎局限于数据库查询,因此我可能会建议使用CursorLoader而不是原始AsyncTask来查询您的数据。如果你的目标不是3.0,你仍然可以通过兼容性库来使用它们。它们只是为了这个目的而设计的;允许系统管理后台任务和Cursor

Loader协议通过LoaderManager,这势必给Activity和处理是否要解雇回调通信,因此您不必担心注销,如果用户的最新刷新前叶完成它的不管。

要阅读有关实现Loader的更多信息,请阅读相关的开发人员指南: http://developer.android.com/guide/topics/fundamentals/loaders.html

HTH

+0

装载机是一个有趣的想法,我不知道他们,因为我最初编写这个应用程序时,V2.2是最新的。但我实际上做的不仅仅是后台查询,我不确定是否可以实现这种方法。但我会研究它。 – gordonwd 2012-02-28 15:54:21

+0

它非常具有可扩展性,您可以使用自己的'CursorLoader' – Devunwired 2012-02-28 19:43:17