30

LoaderCustomSupport(使用AsyncTaskLoader)和FragmentRetainInstanceSupport(使用Thread,几乎相当于AsyncTask)

这两个例子有以下相似之处。

  • 加载数据时两者都不会阻塞 UI 线程
  • 当用户执行屏幕旋转等配置更改时,数据获取线程不会被破坏。
  • 当数据获取线程完成数据获取后,它可以更新到正确的 Fragment UI

但是,也有区别。

异步任务加载器

  • 似乎没有简单的方法可以将中间进度更新到进度条对话框

异步任务

  • 不确定这一点。但 Android 文档似乎推荐AsyncTaskLoader用于异步数据加载并将最终结果更新到 UI

是否有任何指南或清单可供查看,以决定是选择 AsyncTaskLoader 还是 AsyncTask,执行耗时的加载任务并将结果更新到 Fragment 的 UI?

4

2 回答 2

26

你的问题让我很感兴趣,并且有时会尝试研究其中的差异。我在这里写下我的观察。

  1. 对于提前终止,使用 AsyncTask 的异步任务将继续在其线程中运行。结果的处理可能很快导致未请求的结果,而 AsyncTaskLoader 处理活动的过早终止

  2. AsyncTaskLoader 处理活动配置更改(即用户旋转屏幕时的 IE)。

  3. AsyncTaskLoader 旨在为 DataAdapter 加载数据,因此最好使用 AsyncTaskLoader 但是如果您需要在任务完成后更改 UI(特别是片段),最好使用 AsyncTask,因为您无法在 AsynTaskLoader 的 onLoadFinished 中更改片段。

所以对我来说,用法取决于你的任务。如果以上 3 点不打扰您,那么性能是相同的(虽然没有找到任何文档,但在这种情况下建议使用 asynctaskloader :S)

一些相关链接

AsyncTaskLoader 与 AsyncTask

http://andreas-kluck.blogspot.com/2012/02/asynctask-and-asynctaskloader.html

于 2013-03-12T10:15:49.623 回答
0

AsyncTaskLoaders 和所有的 Loader 一样,旨在解决旋转问题,即在 Activity 上创建 AsyncTask,然后在任务完成之前旋转设备,AsyncTask 将随着 Activity 的销毁而丢失。

确实,目前所有的加载器都不支持发布进度,所以如果这是您的情况的要求,那么您应该考虑替代方案。如果旋转或导致 Activity 被销毁的任何其他事件都不是问题,那么只需使用 AsyncTask,否则您可能想要使用服务,并注册一个活页夹来来回推送进度消息。

在我看来,Service 和 Binder 消息有点痛苦。我发现一个更简单的解决方案是使用LocalBroadcastManager从 IntentService(或 AsyncTaskLoader)发送进度广播,并让 Activity 中的 BroadcastReceiver 接收广播并显示进度。

于 2013-03-18T19:52:07.363 回答