13

在后台做一些事情然后更新 UI 很难在 Android 中正确实现。它只是设计得很糟糕。典型示例是从 Web 获取内容并显示结果的 AsyncTask。这有两个问题:

  1. AsyncTask 有一个对 Activity 的引用(因为它需要更新它的 UI)。屏幕方向更改后,Activity 会重新启动。但是 AsyncTask 仍然引用旧的销毁 Activity,因此它不能更新新 Activity 的 UI。

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

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

蜂窝装载机能以某种方式解决这个问题吗?有没有办法在 Honeycomb 之前的 Android 版本中使用它们?

4

2 回答 2

7

是的,根据我的经验,Loader它们似乎可以解决人们遇到的常见问题AsyncTasks和配置更改。

我认为谷歌说片段静态库也将包括在内Loaders,所以是的,当库发布时它们也应该向后工作。

于 2011-02-23T22:25:43.327 回答
4

这不能回答您关于 Honeycomb 加载程序的问题,但以下链接具有一种模式,可以轻松处理 AsyncTasks 的方向更改。

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

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

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

如果您一次需要一个 AsyncTask,则可以在 Activity 中使用对 AsyncTask 的静态引用。另一种选择是保存对应用程序的引用。

然后当一个新的 Activity 启动时,你查看是否有一个 AsyncTask 正在运行并将自己设置为当前 Activity(通过 AsyncTask 上的设置器)。请务必在 AsyncTask 中同步对 Activity 的访问。

于 2011-02-23T21:53:12.177 回答