从UI线程运行异步任务然后修改UI是android开发中的一个常见问题,因此我决定花些时间,研究并使用不同的技术,找到最适合我的方法。
我认为重要的因素是:
Activity
或Fragment
应保持尽可能多的线程管理以下是关于各种方法的印象摘要(可能有些错误,有些只是意见):
当我第一次跳入Android时,我使用简单AsyncTask
而没有LoaderManager
:
AsyncTaskManager
来管理活动生命周期。这似乎是推荐这样做的方式,所以我研究了一下:
Fragment
生命周期管理任务,并且根据我的理解,基本上只需在必要时重新启动任务。在活动重新启动后重新启动活动之前,它似乎无法接收任务开始的结果。Parcelable
或Serialiazable
才能进入Bundle
对象。这是我确定的方法:
所以我得出结论,使用Handler
,Threads
和Messages
是一个更好的解决方案,但我确信我错过了一些东西,因为我看起来几乎无处不在建议使用AsyncTaskLoader
方法。我错过了什么?
感谢您的投入。
答案 0 :(得分:7)
您所缺少的是AsyncTask
和LoaderManager
等类都是以Android编写的。这意味着,与台式计算机相比,操作系统旨在充分利用最小的硬件。 AsyncTask
限制了您的线程池,因为您的线程限制比其他系统更严格。如果您尝试生成100多个线程,新线程将被拒绝或使系统崩溃。你当然可以使用Thread
和Handler
,但就你自己来说,你就是自己。
最后我听说,AsyncTask
支持10个队列深度为10个任务的线程(在以后的版本中可能会增加)。如果这是限制性的,您可以随时获取源代码并编写自己的源代码。我以前做过。你要考虑的重要一点是,我可以在产生太多线程的情况下遇到麻烦,如果是这样,我将如何处理它。
要解决您为什么建议使用LoaderManager
和AsyncTaskLoader
的问题,这只是一个方便。这是一种简单的方法来重新加载数据并将其转移到依赖于该数据的代码部分。在任何情况下都没有必要。
答案 1 :(得分:4)
Handler
,Threads
和Messages
是低级别的。这为您提供了灵活性 - 您可以根据需要将它们组合起来以解决您的特定问题。但是,您还需要处理许多低级别的东西:停止/启动线程,路由到正确的线程,在重新创建活动时保存/恢复或重新创建实例等。
加载程序会为您处理大部分问题,并且旨在很好地解决一个特定问题 - 在活动中加载数据。最重要的是Activity
(或FragmentActivity
)将在重新创建活动时管理和重新启动加载器(这在没有泄漏的情况下做得非常棘手)。它还会缓存数据,因此您无需自己执行此操作。也就是说,如果你想做一些稍微不同的事情,使用Loaders可能会变得很尴尬。因此,如果需要更多灵活性,请考虑AsyncTask
。如果不合适,请降低一级并使用Threads
和Handler
。