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