kotlin协程的生命周期与jetpack组件绑定

2021-04-08  本文已影响0人  程序员大耳

Android 如何使用协程

安卓上, 协程可以帮忙解决两大问题:

管理长时间运行的任务, 这些任务可能阻塞主线程, 导致 UI 卡顿.

在主线程上安全地调用网络或磁盘操作.

安卓上使用协程的最好方式是使用官方的架构组件, 它们提供了对协程的支持. 目前 ViewModel, Lifecycle, LiveData , Room 组件提供了对协程一等的支持.

1、ViewModel ViewModelScope

对 ViewModel 的支持主要是在 ViewModel 上提供了一个称为 ViewModelScope 的 CoroutineScope , 所有在 ViewModelScope 上启动的协程, 当 ViewModelScope 销毁时自动取消. 这样可以有效防止忘记取消任务时导致的资源泄漏.

其实 viewModelScope 的实现非常简单, 就是一个带有 Dispatchers.Main 的 SupervisorJob, 当 ViewModel.clear() 时, 在里面调用 Job.cancel() , 因为结构化并发的原因, 所有在 viewModelScope 范围内启动的协程, 都会级联取消.

2、Lifecycle LifecycleScope

每个具有生命周期的对象(Lifecycle)都有一个 LifecycleScope , 所有在它的范围内启动的协程, 当生命周期对象销毁时, 都会取消. 生命周期对象的 CoroutineScope 可以通过 lifecycle.coroutineScope 或者 lifecycleOwner.lifecycleScope 属性获取.

3、挂起生命周期相关的协程

在 Activity 或者 Fragment 中, 我们有时需要等到某个生命周期方法时, 或者至少在某个生命周期方法之后才执行某一任务, 如页面状态至少要 STARTED 才可以执行 FragmentTransaction , 对这种需求, 生命周期组件也提供了支持. Lifecycle 提供了 lifecycle.whenCreated, lifecycle.whenStarted, lifecycle.whenResumed 三个方法, 运行在这些方法内的协程, 如果页面的状态不是至少处于要求的最小状态, 协程将会挂起运行.

如果协程通过上面的whenXXX方法启动后, 处于活动状态, 还没有结束, 这时页面销毁了, 则协程会自动取消, 并且会走到下面的 finally 块中, 所在 finally 中, 需要检查页面所处的状态, 再决定做什么动作.

这里要注意: 如果页面 restart 重启了, 但协程并不会重启, 总之要确保信息是正确的.

4、LiveData 中使用协程

5、Room 对协程的支持

Room 从 v2.1 开始支持协程

JetPack知识点实战系列三:使用 Coroutines, Retrofit, Moshi实现网络数据请求

上一篇下一篇

猜你喜欢

热点阅读