我在几个地方使用AsyncTasks来进行冗长的数据库查询,然后在PostExecute中填充结果数据视图。但是当它到达那里时,用户可以在我的应用程序中切换屏幕(片段),甚至“退出”应用程序回到启动器。
现在我使用一种有点kludgey的方法,以便AsyncTask可以在进行更新之前检查Activity是否仍然存在。但这真的有必要吗?似乎只要任务处于活动状态,各种View对象仍然存在,所以更新它们虽然无用,但不会对任何事情造成伤害。
在这方面,任何人都有一些关于协调AsyncTasks行动的想法吗?
答案 0 :(得分:2)
保持对已结束活动的引用可能会导致严重的内存问题,因为它会阻止与活动相关的所有内容被gc化。在这个问题上,Android Developer的小组有一个有趣的主题;我认为最有用的帖子是here。
另外,请参阅this thread以获取有关AsyncTask中的缺陷以及如何处理它们的更多信息。
编辑:Santiago Lezica还有this useful blog post特定于将AsyncTask
与已调用setRetainInstance(true);
的片段一起使用。
答案 1 :(得分:0)
由于您的后台任务几乎仅限于数据库查询,因此我建议您使用CursorLoader
代替原始AsyncTask
来查询数据。如果您不是以3.0为目标,则仍可以通过兼容性库使用它们。它们专为此目的而设计;允许系统管理后台任务和Cursor
。
Loader
协议通过LoaderManager
进行通信,该Activity
绑定到Loader
并处理是否触发回调,因此您无需担心取消注册,并且如果用户在最新刷新完成之前离开,则无所谓。
要阅读有关实施{{1}}的更多信息,请阅读相关的开发者指南: http://developer.android.com/guide/topics/fundamentals/loaders.html
HTH