在Fragment中使用的AsyncTaskLoader和AsyncTask中选择的指南

时间:2013-02-26 01:46:50

标签: android

查看LoaderCustomSupport(使用AsyncTaskLoader)和FragmentRetainInstanceSupport(使用Thread,几乎等同于AsyncTask)

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

  • 加载数据时都不会阻止UI线程
  • 当用户执行屏幕旋转等配置更改时,不会销毁数据获取线程。
  • 当数据提取线程完成提取数据时,它可以更新到正确的Fragment UI

然而,存在差异。

AsyncTaskLoader

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

的AsyncTask

  • 对此不确定。但Android文档似乎建议AsyncTaskLoader 异步数据加载并将最终结果更新到UI

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

2 个答案:

答案 0 :(得分:26)

你的问题让我感兴趣,并有时尝试调查差异。我在这里写下我的观察。

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

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

  3. AsyncTaskLoader是为DataAdapters加载数据所以为此目的最好使用AsyncTaskLoader但是如果你需要在任务完成后更改UI(特别是片段),最好使用AsyncTask,因为你不能更改片段在onLoadFinished of AsynTaskLoader。

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

    一些相关链接

    AsyncTaskLoader vs AsyncTask

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

答案 1 :(得分:0)

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

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

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