Android 为什么将AsyncTaskLoader与LoaderManager一起使用,而不是简单的处理程序?

Android 为什么将AsyncTaskLoader与LoaderManager一起使用,而不是简单的处理程序?,android,multithreading,android-asynctask,android-ui,android-handler,Android,Multithreading,Android Asynctask,Android Ui,Android Handler,从UI线程运行异步任务,然后修改UI是android开发中的一个常见问题,因此我决定花一些时间,研究和使用不同的技术,找到最适合我的方法 我认为重要的因素是: 应该可靠地工作 代码可读性 活动或片段应尽可能避免线程管理 以下是我对各种方法的印象总结(可能是错误的,有些只是观点): 异步任务 当我第一次跳入Android时,我使用的是简单的AsyncTask,没有LoaderManager: 对于间歇性问题,我编写了自己的AsyncTaskManager,以在活动生命周期中管理它们 以前报告

从UI线程运行异步任务,然后修改UI是android开发中的一个常见问题,因此我决定花一些时间,研究和使用不同的技术,找到最适合我的方法

我认为重要的因素是:

  • 应该可靠地工作
  • 代码可读性
  • 活动
    片段
    应尽可能避免线程管理
以下是我对各种方法的印象总结(可能是错误的,有些只是观点):

异步任务 当我第一次跳入Android时,我使用的是简单的
AsyncTask
,没有
LoaderManager

  • 对于间歇性问题,我编写了自己的
    AsyncTaskManager
    ,以在活动生命周期中管理它们
  • 以前报告过的任务数量和内存泄漏有一些限制
  • 最大的问题是,它们使我的代码非常复杂,而简化代码首先就违背了使用它们的目的
带LoaderManager的AsyncTaskLoader 这似乎是推荐的方法,因此我对其进行了一些研究:

  • 在阅读了这些内容之后,推荐使用此方法的主要原因似乎是因为它使用
    片段
    生命周期管理任务,根据我的理解,基本上只要在必要时重新启动任务即可。它似乎无法接收在活动重新启动后重新启动活动之前启动的任务的结果
  • 所有任务参数似乎都必须是
    Parcelable
    Serialiazable
    才能放入
    Bundle
    对象中
处理程序、线程和消息 这是我确定的方法:

  • 易于实现,可定制性极强
  • 您可以访问执行任务的线程:设置优先级、设置调试线程名称、设置守护进程等
  • 与使用AsyncTasks相比,使用AsyncTasks的响应性似乎更高,这是基于一项目测测试,在该测试中,我多次单击按钮,然后看着结果和线程闪过;)我可以对此进行基准测试
  • 要处理生命周期问题,可以编写一个单例类来管理消息(在进程处于活动状态时持续存在)。在未设置给定活动的处理程序时存储它们,然后在活动处理程序请求丢失的消息时将它们转发给活动处理程序。这意味着任务不必使用相同的参数重新启动,这对于非幂等的任务来说非常关键


因此我得出结论,使用
处理程序
线程
、和
消息
是一个更好的解决方案,但我确信我遗漏了一些东西,因为几乎我看到的每一个地方都建议使用
AsyncTaskLoader
方法。我错过了什么


谢谢你的意见

您缺少的是像
AsyncTask
LoaderManager
这样的类是在编写时考虑到Android的。这意味着,与台式计算机相比,操作系统旨在充分利用最小的硬件
AsyncTask
限制了线程池,因为与其他系统相比,您有更严格的线程限制。如果您尝试生成100多个线程,新线程将被拒绝或使系统崩溃。当然,您可以使用
线程
处理程序
,但您可以自行管理它

上次我听说,
AsyncTask
支持10个线程,队列深度为10个任务(在以后的版本中可能会增加)。如果这是限制性的,您可以随时获取源代码并编写自己的。我以前做过。你要考虑的重要问题是,我能在路上产生麻烦,产生太多的线程,如果是这样的话,我将如何处理它?


为了解决您的问题,即为什么建议使用
LoaderManager
AsyncTaskLoader
,这只是一种方便。这是一种简单的方法,可以重新加载数据,并将其发送到依赖于该数据的代码部分。并非在所有情况下都保证使用它。

处理程序
线程
消息
都是低级类。这为您提供了灵活性--您可以根据需要将它们组合起来以解决特定的问题。但是,您还需要处理很多低级的事情:停止/启动线程、路由到正确的线程、在重新创建活动时保存/恢复或重新创建实例,等等


加载程序为您解决了大部分这方面的问题,并且设计用于很好地解决一个特定问题——在活动中加载数据。最大的优点是
活动
(或
片段活动
)将在重新创建活动时负责管理和重新启动加载程序(这在不泄漏的情况下很难做到正确)。它还缓存数据,因此您无需自己执行此操作。也就是说,如果您想做一些稍微不同的事情,那么使用Loader可能会很尴尬。因此,如果需要更多的灵活性,请考虑<代码>异步任务< /代码>。如果这不合适,请降低一级并使用
线程
处理程序

处理程序
线程
消息
是构建块
AsyncTask
LoaderManager
就是从这些代码中构建的,考虑到了特定的用例,并且符合使用中大多数公认的模式。因此,用例在这里很重要。只有当提供的类不足以完成任务时,才应该使用自定义解决方案。我得出的结论是,自定义解决方案更易于实现,并且为几乎所有具有中等复杂性的情况提供了更多功能和灵活性。