Honeycomb Loaders可以解决AsyncTask + UI更新的问题吗?

时间:2011-02-23 21:44:48

标签: android android-3.0-honeycomb android-loader

在后台执行某些操作然后更新UI很难在Android中正确实现。它设计得很糟糕。典型的例子是AsyncTask,它从Web获取内容并显示结果。这有两个问题:

  1. AsyncTask引用了Activity(因为它需要更新其UI)。屏幕方向更改后,重新启动活动。但是AsyncTask仍然引用旧的被破坏的Activity,因此它无法更新新Activity的UI。

  2. 这可能导致OutOfMemoryException。想象一下,你有一个包含大量位图的Activity,并启动一些AsyncTask。您按BACK(活动已完成)但AsyncTask仍在运行,并且因为它引用了Activity,所以带有位图的Activity仍在内存中。重复此操作(开始活动和返回),你的力量迟早会被关闭。

  3. 这可以解决,但它太复杂了。在一个Activity中,我有3个不同的AsyncTasks,每个都可以同时在多个实例中运行。正确实现这一点令人沮丧。代码变得非常难以理解和调试。

    可以Honeycomb Loaders以某种方式解决这个问题吗?有没有办法在pre-Honeycomb Android版本中使用它们?

2 个答案:

答案 0 :(得分:7)

是的,根据我对Loader的体验,他们似乎解决了人们对AsyncTasks和配置更改的常见问题。

我认为Google表示片段静态库会包含Loaders,所以是的,它们也应该在库发布时向后工作。

答案 1 :(得分:4)

这不能解答有关Honeycomb加载器的问题,但以下链接的模式可以轻松处理AsyncTasks的方向更改。

http://evancharlton.com/thoughts/rotating-async-tasks/

还有其他一些很棒的帖子。

更新:正如OP在评论中指出的那样,这仅适用于配置(方向)更改,但在使用BACK按钮并通过主菜单或任务列表重新启动时不起作用。

如果您一次只需要一个AsyncTask,那么您可以在Activity中使用对AsyncTask的静态引用。另一种选择是保存对Application的引用。

然后,当启动一个新的Activity时,您会查看是否正在运行AsyncTask并将其自身设置为当前Activity(通过AsyncTask上的setter)。确保同步访问AsyncTask中的Activity。