8

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

我认为的重要因素:

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

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

异步任务

当我第一次进入 Android 时,我使用的是 simple AsyncTaskwithout :LoaderManager

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

AsyncTaskLoader 和 LoaderManager

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

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

处理程序、线程和消息

这是我确定的方法:

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

所以我得出的结论是,使用Handler,ThreadsMessages是一个更好的解决方案,但我确信我遗漏了一些东西,因为我看到的几乎所有地方都建议使用该AsyncTaskLoader方法。我错过了什么?

感谢您的输入。

4

2 回答 2

7

您缺少的是类喜欢AsyncTask并且LoaderManager是在考虑 Android 的情况下编写的。这意味着,与台式计算机相比,该操作系统旨在充分利用最少的硬件。AsyncTask限制你的线程池,因为你有比其他系统更严格的线程限制。如果您尝试生成 100 多个线程,新线程将被拒绝或系统崩溃。您当然可以使用Threadand Handler,但您需要自行管理它。

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

为了解决您关于为什么建议使用LoaderManagerand的问题AsyncTaskLoader,这只是一种方便。这是一种重新加载数据并将其获取到依赖于该数据的代码部分的简单方法。并非在所有情况下都需要这样做。

于 2012-10-29T07:40:01.720 回答
4

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

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

于 2012-10-29T09:23:37.173 回答