Android - 执行异步任务的最佳方式
Posted
技术标签:
【中文标题】Android - 执行异步任务的最佳方式【英文标题】:Android - Best way to do asynchronous tasks 【发布时间】:2016-10-23 07:15:04 【问题描述】:我有一个非常密集的任务,我解析存储在资产中的大约 100 个 json 文件并从中创建一个树结构.. 然后我根据结果树更新 UI。l
目前,我正在使用 AsyncTask 来完成这项工作。
但是,我正在寻找更好、更高效、更干净的方法来做到这一点。我应该使用的任何库或任何其他内置功能?
【问题讨论】:
【参考方案1】:我会在这里使用IntentService
。它已经提供了一个后台线程,一旦完成它就会自行停止。如果之后需要更新 UI,可以使用Handler
或BroadcastReceiver
。
编辑
您仍然可以使用AsyncTask
,但仍然可以从Service
开始。 AsyncTask
只是 java 线程的包装器,它不是 android 组件。您必须从某些上下文开始,在这种情况下它是Activity
或Service
。
如果您从Activity
启动它,那么您的长时间运行将取决于 UI,这在大多数情况下会导致内存泄漏。 Service
是一个独立于 UI 运行的后台组件。此外,Service
将提高您应用的进程优先级,以便在系统运行在低内存时它不太可能被 Android 杀死。
如果您使用IntentService
,则不再需要AsyncTask
,它已经在后台线程上运行。如果您想使用常规的Service
,则需要自行实现后台执行。例如通过 java 线程或异步任务。
【讨论】:
您能否说明使用 IntentService 优于 AsyncTask 的好处,是的,我必须在任务完成后更新 UI。 我已经编辑了答案。如果您有任何问题,请告诉我。 您好,Gennadii,很好的解释。您能否说明以下两点:- 1)从 Activity 调用 AsyncTask 会造成什么危害。 2)如果我使用 IntentService 执行任务,在 UI 线程上填充数据的良好做法是什么? 1) 如果用户关闭活动并且您的异步任务仍在运行,那么您的活动对象无法被 GC 回收,并且您将泄漏大量内存,包括整个视图层次结构。 2) 这是一个单独的主题。简而言之,您应该使用附加到 UI 线程的Handler
,或者,BroadcastReceiver
,任何更适合您的方法。在某些情况下,如果使用数据库,您可以注册一个加载程序或ContentObserver
,一旦您将数据写入数据库,就会触发它。解决方案取决于您的用例。
谢谢哥们!!我想我现在有足够的信息来推进它..【参考方案2】:
如果这很繁重且运行时间很长,请使用Service
并使用广播接收器进行通信。
【讨论】:
您能否说明使用 Service over AsyncTask 的好处,是的,我必须在任务完成后更新 UI。以上是关于Android - 执行异步任务的最佳方式的主要内容,如果未能解决你的问题,请参考以下文章