从 UI 线程运行异步任务然后修改 UI 是 android 开发中的一个常见问题,所以我决定花一些时间,研究并尝试不同的技术并找到最适合我的技术。
我认为的重要因素:
- 应该可靠地工作
- 代码可读性
Activity
或者Fragment
应该尽可能多地保持线程管理的清洁
以下是我对各种方法的印象总结(可能是错误的,有些只是意见):
异步任务
当我第一次进入 Android 时,我使用的是 simple AsyncTask
without :LoaderManager
- 有间歇性问题,我自己编写
AsyncTaskManager
了活动生命周期来管理它们。 - 任务数量有一些限制,之前已经报告过内存泄漏。
- 这些最大的问题是它们使我的代码非常复杂,并且简化代码首先破坏了使用它们的目的。
AsyncTaskLoader 和 LoaderManager
这似乎是推荐的方法,所以我研究了一下:
- 在阅读了这些之后,似乎推荐这种方法的主要原因是因为它管理具有
Fragment
生命周期的任务,并且据我了解基本上只是在必要时重新启动任务。在活动重新启动后,似乎无法接收在活动重新启动之前启动的任务的结果。 - 所有的任务参数似乎都必须是
Parcelable
或Serialiazable
进入一个Bundle
对象。
处理程序、线程和消息
这是我确定的方法:
- 易于实施,高度可定制。
- 您可以访问执行任务的线程:设置优先级、设置用于调试的线程名称、设置守护进程等。
- 似乎比使用 AsyncTasks 响应更快,基于我多次单击按钮并观察结果和线程闪烁的眼睛测试;)我可以对此进行基准测试。
- 要处理生命周期问题,可以编写一个管理消息的单例类(在进程处于活动状态时持续存在)。当给定活动的处理程序未设置时存储它们,然后如果它要求其丢失的消息,则将它们转发给活动处理程序。这意味着任务不必使用相同的参数重新启动,这对于非幂等任务至关重要。
所以我得出的结论是,使用Handler
,Threads
和Messages
是一个更好的解决方案,但我确信我遗漏了一些东西,因为我看到的几乎所有地方都建议使用该AsyncTaskLoader
方法。我错过了什么?
感谢您的输入。