查看LoaderCustomSupport(使用AsyncTaskLoader)和FragmentRetainInstanceSupport(使用Thread,几乎等同于AsyncTask)
两个例子都有以下相似之处。
然而,存在差异。
是否有任何指南或清单可以决定是否选择AsyncTaskLoader或AsyncTask来执行耗时的加载任务并将结果更新到Fragment的UI?
答案 0 :(得分:26)
你的问题让我感兴趣,并有时尝试调查差异。我在这里写下我的观察。
对于提前终止,使用AsyncTask的异步任务将继续在其线程中运行。结果的处理很快就会导致未经请求的结果,而AsyncTaskLoader处理活动的提前终止
AsyncTaskLoader处理活动配置更改(用户旋转屏幕时的IE)。
AsyncTaskLoader是为DataAdapters加载数据所以为此目的最好使用AsyncTaskLoader但是如果你需要在任务完成后更改UI(特别是片段),最好使用AsyncTask,因为你不能更改片段在onLoadFinished of AsynTaskLoader。
所以对我而言,用法取决于你的任务。如果以上3点没有打扰你那么性能是相同的(虽然没有找到任何文件,但在这种情况下建议使用asynctaskloader:S)
一些相关链接
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中接收广播并显示进度。