为什么在LoaderManager中使用AsyncTaskLoader而不是简单的Handler?

在UI线程中运行asynchronous任务,然后修改UI是Android开发中的一个常见问题,所以我决定花一些时间,研究和玩弄不同的技术,find最适合我的东西。

我认为重要的因素:

  • 应该可靠地工作
  • 代码可读性
  • ActivityFragment应该保持尽可能多的线程pipe理

以下是关于各种方法的印象(可能是错误的,有些只是意见)的总结:

的AsyncTask

当我第一次跳入Android时,我使用的是没有LoaderManager AsyncTask

  • 有间歇性的问题,我写了我自己的AsyncTaskManager来pipe理他们的活动生命周期。
  • 任务数量有一些限制,之前已经报告过内存泄漏。
  • 最大的问题是他们让我的代码变得非常复杂,而简化代码却打败了首先使用它们的目的。

具有LoaderManager的AsyncTaskLoader

这似乎是推荐的方法,所以我研究了一下:

  • 在阅读了这些内容之后,似乎推荐这种方法的主要原因是因为它使用Fragment生命周期来pipe理任务,并且根据我的理解,基本上只是在必要时重新启动任务。 在活动重新启动之后,似乎无法接收活动重新启动之前启动的任务的结果。
  • 所有的任务参数似乎必须是SerialiazableSerialiazable才能进入一个Bundle对象。

处理程序,线程,与消息

这是我解决的方法:

  • 易于实施,非常可定制。
  • 您可以访问执行任务的线程:设置优先级,设置debugging线程名称,设置守护进程等。
  • 似乎比使用AsyncTasks更为敏感,基于一个眼睛testing,我点击一个button很多次,看着结果和线程闪过;)我可以基准这个。
  • 为了处理生命周期问题,可以编写一个pipe理消息的单例类(在进程处于活动状态时仍然存在)。 当给定的活动处理程序没有设置时,将它们存储起来,如果它要求input错过的消息,则将它们转发给活动处理程序。 意思是一个任务不需要用相同的参数来重启,这对于非幂等任务是非常重要的。

所以我得出的结论是使用HandlerThreadsMessages是一个更好的解决scheme,但是我相信我错过了一些东西,因为几乎所有我看起来推荐的东西是使用AsyncTaskLoader方法。 我错过了什么?

感谢您的input。

Solutions Collecting From Web of "为什么在LoaderManager中使用AsyncTaskLoader而不是简单的Handler?"

你所缺less的就是AsyncTaskLoaderManager这些类是用Android编写的。 这意味着,与台式机相比,操作系统旨在充分利用最less的硬件。 AsyncTask限制你的线程池,因为你比其他系统有更严格的线程限制。 如果您尝试产生100多个线程,新线程将被拒绝或崩溃系统。 你当然可以使用ThreadHandler ,但是就你自己而言,只要pipe理它就可以了。

最后我听说, AsyncTask支持10个线程,其队列深度为10个任务(可能在更高版本中增加)。 如果这是限制性的,你可以随时获取源代码并编写自己的代码。 我以前做过。 你要考虑的重要的事情是,我能不能在路上产生太多的线索而陷入困境,如果是的话,我将如何处理它。

为了解决你为什么推荐使用LoaderManagerAsyncTaskLoader ,这只是一个方便。 这是一种简单的方法来重新加载数据,并将其传送到依赖于数据的代码部分。 在任何情况下都没有保证。

HandlerThreadsMessages是低级的类。 这给了你灵活性 – 你可以结合他们,你认为合适的解决你的特定问题。 但是,您还需要处理很多低级别的东西:停止/启动线程,路由到正确的线程,在重新创build活动时保存/恢复或重新创build实例等。

装载机会为您处理大部分问题,旨在解决一个特定的问题 – 在一个活动中加载数据。 最大的好处是Activity (或FragmentActivity )将负责pipe理和重新启动你的装载机,当活动重新创build(这是非常棘手的做正确的没有泄漏)。 它也caching数据,所以你不需要自己做这个。 也就是说,如果你想做一些稍微不同的事情,使用Loaders可能会变得笨拙。 所以如果需要更多的灵活性,可以考虑一下AsyncTask 。 如果不适合,降低一级,并使用ThreadsHandler