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

Emi*_*yan 8 multithreading android android-ui android-asynctask android-handler

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

我认为重要的因素是:

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

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

的AsyncTask

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

  • 有间歇性的问题,我自己写了AsyncTaskManager一个用活动生命周期来管理它们.
  • 任务数量存在一些限制,之前已报告过内存泄漏.
  • 这些问题的最大问题在于它们使我的代码非常复杂,并且简化代码首先失败了使用它们的目的.

带有LoaderManager的AsyncTaskLoader

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

  • 在阅读了这些之后,似乎推荐这种方法的主要原因是因为它管理Fragment生命周期中的任务,并且从我的理解基本上只是在必要时重新启动任务.在活动重新启动后重新启动活动之前,它似乎无法接收启动任务的结果.
  • 所有任务参数似乎必须是ParcelableSerialiazable进入Bundle对象.

处理程序,线程,消息

这是我确定的方法:

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

所以,我来到了,使用的结论Handler,ThreadsMessages是一个更好的解决办法,但我相信,我失去了一些东西,因为几乎到处都看着我的建议是使用AsyncTaskLoader方法.我错过了什么?

感谢您的投入.

Jas*_*son 7

您所缺少的是类似于Android的类,AsyncTask并且LoaderManager是用Android编写的.这意味着,与台式计算机相比,操作系统旨在充分利用最小的硬件.AsyncTask限制您的线程池,因为您有比其他系统更严格的线程限制.如果您尝试生成100多个线程,则新线程将被拒绝或使系统崩溃.您当然可以使用ThreadHandler,但你是你自己的,只要管理它.

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

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