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

时间:2012-10-29 07:00:42

标签: android multithreading android-asynctask android-ui android-handler

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

我认为重要的因素是:

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

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

的AsyncTask

当我第一次跳入Android时,我使用简单AsyncTask而没有LoaderManager

  • 如果出现间歇性问题,我会编写自己的AsyncTaskManager来管理活动生命周期。
  • 以前报告过任务数量有一些限制和内存泄漏。
  • 这些问题的最大问题在于,它们使我的代码变得非常复杂,并且简化代码首先打败了使用它们的目的。

带有LoaderManager的AsyncTaskLoader

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

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

处理程序,线程,带消息

这是我确定的方法:

  • 易于实施,可定制化。
  • 您可以访问执行任务的线程:设置优先级,设置调试的线程名称,设置守护程序等。
  • 似乎比使用AsyncTasks更具响应性,基于眼睛测试我多次点击一个按钮并观看结果和线程闪现;)我可以对此进行基准测试。
  • 要处理生命周期问题,可以编写一个管理消息的单例类(在进程处于活动状态时保持不变)。在未设置给定活动的处理程序时存储它们,然后在它询问其错过的消息时将它们转发到活动处理程序。这意味着任务不必使用相同的参数重新启动,这对于非幂等的任务非常重要。

所以我得出结论,使用HandlerThreadsMessages是一个更好的解决方案,但我确信我错过了一些东西,因为我看起来几乎无处不在建议使用AsyncTaskLoader方法。我错过了什么?

感谢您的投入。

2 个答案:

答案 0 :(得分:7)

您所缺少的是AsyncTaskLoaderManager等类都是以Android编写的。这意味着,与台式计算机相比,操作系统旨在充分利用最小的硬件。 AsyncTask限制了您的线程池,因为您的线程限制比其他系统更严格。如果您尝试生成100多个线程,新线程将被拒绝或使系统崩溃。你当然可以使用ThreadHandler,但就你自己来说,你就是自己。

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

要解决您为什么建议使用LoaderManagerAsyncTaskLoader的问题,这只是一个方便。这是一种简单的方法来重新加载数据并将其转移到依赖于该数据的代码部分。在任何情况下都没有必要。

答案 1 :(得分:4)

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

加载程序会为您处理大部分问题,并且旨在很好地解决一个特定问题 - 在活动中加载数据。最重要的是Activity(或FragmentActivity)将在重新创建活动时管理和重新启动加载器(这在没有泄漏的情况下做得非常棘手)。它还会缓存数据,因此您无需自己执行此操作。也就是说,如果你想做一些稍微不同的事情,使用Loaders可能会变得很尴尬。因此,如果需要更多灵活性,请考虑AsyncTask。如果不合适,请降低一级并使用ThreadsHandler