【问题标题】:Guideline to choose among AsyncTaskLoader and AsyncTask to be used in Fragment在 Fragment 中选择 AsyncTaskLoader 和 AsyncTask 的指南
【发布时间】:2013-02-26 01:46:50
【问题描述】:

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

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

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

但是,还是有区别的。

AsyncTaskLoader

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

异步任务

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

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

【问题讨论】:

    标签: android


    【解决方案1】:

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

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

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

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

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

    一些相关链接

    AsyncTaskLoader vs AsyncTask

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

    【讨论】:

    • 关于您的第 1 点,AsyncTask 或整个 Activity 的“提前终止”?
    【解决方案2】:

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

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

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

    【讨论】:

    • 请注意我在问题中给出的FragmentRetainInstanceSupport 链接。在非 UI 片段的适当帮助下,您也可以在 AsyncTask 中处理旋转。
    • 因此您可以将异步任务放在非 UI 片段中,并通过活动将进度发布到 UI 片段 - 如果没有附加活动,则不会报告任何进度?
    • 那么,如果 AsyncTask 正在运行并且我旋转屏幕,那么 AsyncTask 会丢失吗?而且,同样情况下,AsyncTaskLoader 不会丢失?
    • 一般来说是的。您的 Activity 将丢失它对 AsyncTaskLoader 的引用,但可以使用 LoaderManager 检索它(以类似于它的创建方式)。 developer.android.com 上有大量关于正确实现 Loaders 的文档。我还应该补充一点,我在这里的原始答案已经超过 2 岁了。从那时起,时代和我的偏好都发生了变化,现在我通常只使用 RxJava(和一个单例)通过诸如轮换之类的配置更改来管理持久的长时间运行的操作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多