| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 移动开发 -> Kotlin之协程coroutine lifecycleScope 和 viewModelScope源码(2) -> 正文阅读 |
|
[移动开发]Kotlin之协程coroutine lifecycleScope 和 viewModelScope源码(2) |
上一篇文章 Kotlin之协程coroutine使用(1)? 文末介绍了Activity,Fragment 和 ViewModelScope 对应的自动绑定生命周期协程开启方式, lifecycleScope? 和 viewModelScope 这篇文章,就解剖一下,为什么这两货可以绑定生命周期,不需要用户自己去绑定取消? ========================================================================= Activity 和 Fragment? 对应的? lifecycleScope?========================================================================= 先看一下 Activity 开启方式
再看一下 Fragment 开启方式
点进去各自的 lifecycleScope 看一下,其实都是 androidx.lifecycle:lifecycle-runtime-ktx 包下的LifecycleOwner 对应的 lifecycleScope , 可以看到是通过 lifeCycle? 获得 coroutineScope,那究竟 lifeCycle? 是怎么获得 coroutineScope,又是怎么将 coroutineScope 和生命周期绑定的,我们进去看一下
上面源码添加注释1.2.3.4.5 已经很明显了,整个流程是: 1:Activity 和 Fragment 获得的 都是通过 lifecycleScope? 通过 LifecycleOwner 获得 2:这个 coroutineScope 是通过 LifecycleCoroutineScopeImpl 封装,这个 LifecycleCoroutineScopeImpl 同时实现了 LifecycleEventObserver 和 CoroutineScope 接口。 3:所以(通过CoroutineScope )创建协程时,(通过LifecycleEventObserver )监听生命周期,当生命周期跑到destory时,取消监听并取消协程。 ========================================================================= ViewModel? 对应的? viewModelScope?========================================================================= 看下 ViewModel 怎么开启,viewModelScope? 是 ViewModel? 自有属性,直接调用即可
看下 viewModelScope?? 是怎么实现的
看注释1.2.3.......知道ViewModel 怎么开启保存协程了,但是注释 3是取消协程的,到底什么时候调用的。要想知道什么时候调用,就要进入上面注释1,忽略的两个方法 getTag() 和 setTagIfAbsent() 这个两方法对应有一个 叫:mBagOfTags 的 Map, ?看上面两个方法是看不出什么时候调用close()方法的,我们要看一下这个 mBagOfTags 还在其他什么地方/时候调用,在这个 ViewModel.java 里,我们很容易看到?mBagOfTags 有在 clear()方法里面调用
注释2 , 3 找到 close() 的地方。但是,我们是找到了关闭协程的地方,但是什么时候会调用 clear() 我们看一下 clear()引用的地方。 看到是通过 ViewModelStore 的 clear() 调用的。 发现通过Activity 和 Fragment 调用。笔者在跟其源码一步步找下去时,分别在Activity 和Fragment?? destory时会触发他们对应的方法,去清除释放他们对应ViewModel 的 mBagOfTags 持有 数据。 至于这一部分,笔者就不贴代码追踪,因为不是本文要学习的内容。有兴趣的同学可以去看一下。 在这里笔者提醒一下,看源码不要转牛角尖,看个大概逻辑思路即可,要猜一半看一半,千万不要让自己把每一步代码搞懂,防止深陷源码不能自拔。 【总结】 ?在这个再总结一下,ViewModel 会保存一个对应 ViewModelScope? ,初次获取时会保存在其mBagOfTags 的Map里面,再次获取会从这个 mBagOfTags 取出。当 ViewModel 宿主体(Activity 或 Fragment )销毁时,Activity 或 Fragment会通过 ViewModelStore,把 ViewModel 的 mBagOfTags 持有数据全部清除释放掉,当然协程就是在这个时候放取消掉。 |
|
移动开发 最新文章 |
Vue3装载axios和element-ui |
android adb cmd |
【xcode】Xcode常用快捷键与技巧 |
Android开发中的线程池使用 |
Java 和 Android 的 Base64 |
Android 测试文字编码格式 |
微信小程序支付 |
安卓权限记录 |
知乎之自动养号 |
【Android Jetpack】DataStore |
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/23 17:11:02- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |