Android 在片段中使用的AsyncTaskLoader和AsyncTask之间进行选择的指南

Android 在片段中使用的AsyncTaskLoader和AsyncTask之间进行选择的指南,android,Android,查看(使用AsyncTaskLoader)和(使用线程,几乎等同于AsyncTask) 这两个例子有以下相似之处 加载数据时,两者都不会阻止UI线程 当用户执行配置更改(如屏幕旋转)时,数据获取线程不会被破坏 当数据获取线程完成数据获取后,它可以更新到正确的片段UI 然而,两者之间存在差异 异步任务加载器 似乎没有简单的方法将中间进度更新为进度条对话框 异步任务 我不确定。但Android文档似乎建议异步加载数据并将最终结果更新到UI 是否有任何指导方针或检查表可供参考,以决定是选择

查看(使用AsyncTaskLoader)和(使用线程,几乎等同于AsyncTask)

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

  • 加载数据时,两者都不会阻止UI线程
  • 当用户执行配置更改(如屏幕旋转)时,数据获取线程不会被破坏
  • 当数据获取线程完成数据获取后,它可以更新到正确的片段UI
然而,两者之间存在差异

异步任务加载器
  • 似乎没有简单的方法将中间进度更新为进度条对话框
异步任务
  • 我不确定。但Android文档似乎建议异步加载数据并将最终结果更新到UI

是否有任何指导方针或检查表可供参考,以决定是选择AsyncTaskLoader还是AsyncTask,执行耗时的加载任务并将结果更新到Fragment的UI?

您的问题使我感兴趣,有时还试图探究其中的差异。我在这里写下我的观察

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

  • AsyncTaskLoader处理活动配置更改(即当用户旋转屏幕时)

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

  • 所以对我来说,用法取决于你的任务。如果以上三点没有影响您,那么性能是相同的(虽然没有找到任何文档,但在本例中建议使用asynctaskloader:S)

    一些相关链接


    与所有加载程序一样,AsyncTaskLoader旨在解决旋转问题,即在活动上创建AsyncTask时,在任务完成之前旋转设备,该AsyncTask将随着活动的销毁而丢失

    确实,所有的加载器目前不支持发布进度,所以如果这是对您的情况的要求,那么您应该考虑另一种选择。如果旋转或导致活动被破坏的任何其他事件不是问题,那么只需使用AsyncTask,否则您可能需要使用服务并注册绑定器来来回推送进度消息


    然而,在我看来,服务和活页夹信息是一种痛苦。我发现一个更简单的解决方案是使用IntentService(或AsyncTaskLoader)发送进度广播,让活动中的广播接收器接收广播并显示进度。

    请注意我在问题中给出的
    FragmentRetainInstanceSupport
    链接。在非UI片段的适当帮助下,您也可以在AsyncTask中处理旋转。因此,您可以将AsyncTask放置在非UI片段中,并通过活动将进度发布到UI片段-如果未附加任何活动,则不会报告任何进度?因此,如果AsyncTask正在运行且我旋转屏幕,则AsyncTask将丢失?在同样的情况下,AsyncTaskLoader不会丢失?一般来说是的。您的活动将丢失对AsyncTaskLoader的引用,但可以使用LoaderManager检索它(与创建它的方式类似)。在developer.android.com上有大量关于正确实现加载程序的文档。我还要补充一点,我原来的答案已经有两年多了。从那时起,时间和我的首选项都发生了变化,现在我通常只使用RxJava(和单例)通过配置更改(如旋转)来管理长期运行的操作。关于第一点,异步任务或整个活动的“提前终止”?