Android Kotlin-协程
文章目录
- 1.线程与协程
- 2.异步与协程
- 2.1传统的方式完成异步任务网络加载
- 2.2下面是使用协程的方式
- 3.协程的挂起与恢复
- 4.协程背后的状态机原理
- 5.协程+MVVM+Jecpack项目架构
- 5.1Google Jecpack+MVVM架构设计
- 5.2.协程+Retrofit+MVVM+DataBinding
1.线程与协程
- 线程的封装框架,从宏观角度看,可以这么认为
- 协程有点像轻量级的线程
- 从包含关系上看,协程跟线程的关系,有点像“线程与进程的关系”,协程不可能脱离线程运行
- 协程虽然不能脱离线程,但是可以在不同的线程切换
协程高效、轻量级,可以解决大并发的问题,但是协程的真正魅力是,最大的成都简化异步并发任务,用同步代码写出异步的效果。
2.异步与协程
2.1传统的方式完成异步任务网络加载
mProgressDialog = ProgressDialog(this)
mProgressDialog.setTitle("请求服务器中...")
mProgressDialog.show()
mTextView.setText("请求服务器中...")
thread {var call = RetrofitClient.instance.initRetrofit(WanAndroidAPI::class.java).login("lpf666", "123456")val result = call.execute()var msg = mHandler.obtainMessage()msg.obj = result.body()?.datamHandler.sendMessage(msg)
}val mHandler = Handler(Looper.getMainLooper()) {val result = it.obj as UserInfomTextView.text = result.toString() // 更新控件 UImProgressDialog?.dismiss() // 隐藏加载框false}
- 传统的方式需要启一个线程
- 执行请求,得到结果之后使用Handler将结果发送给主线程
- 主线程更新UI
2.2下面是使用协程的方式
mMainScope.launch {Log.d("lpf", Thread.currentThread().name)mProgressDialog = ProgressDialog(this@Coroutines2Activity)mProgressDialog.setTitle("请求服务器中...")mProgressDialog.show()mTextView.setText("请求服务器中...")//可以完美解决网络嵌套的问题var result = RetrofitClient.instance.initRetrofit(WanAndroidAPI::class.java).loginCoroutine("lpf666", "123456")mTextView.text = result.data.toString()// 更新控件 UImProgressDialog?.dismiss() // 隐藏加载框
}
协程的方式这样就实现了,不需要创建子线程,不需要发消息,代码非常简洁,网络层只需要加上suspen关键字就可以。
协程可以解决异步回调的问题、协程同样可以解决多层网络嵌套的问题。
使用过程中注意的点:
- GlobalScope:全局作用域,默认是子线程,一般可以测试使用,不要直接使用否则可能会发生内存泄漏。
- MainScope:这个是局部作用域,可以直接在activity使用这个Scope,注意需要在OnDestroy进行释放
- viewModelScope:这个也是局部作用域,默认主线程,是ViewModel中自带的一个不需要创建直接使用就行。
协程可以轻松进行线程切换
mMainScope.launch(Dispatchers.Main) {}
设置Dispatchers.IO()就是子线程了。
3.协程的挂起与恢复
执行协程部分的代码逻辑,会自动挂起到IO线程,执行完成会自动恢复Main线程。
每一次从主线程到IO线程,都是一次协程挂起(suspend)
每一次从IO恢复到主线程,都是一次协程的(resume)
挂起,只是将程序执行流程转移到其他线程,并未阻塞主线程。
var result = RetrofitClient.instance.initRetrofit(WanAndroidAPI::class.java).loginCoroutine("lpf666", "123456")
以这行代码为例=号的左边的部分就是主线程,右边的部分就是子线程,这是协程自动挂起的。
使用协程会看到小图标:
- 可以挂起执行异步操作
- 可以恢复执行主线程
协程还需要遵守颜色规则,这一点很关键
4.协程背后的状态机原理
将执行协程的代码反编译之后,可以看到一个Continuation
@kotlin.SinceKotlin public interface Continuation<in T> {public abstract val context: kotlin.coroutines.CoroutineContextpublic abstract fun resumeWith(result: kotlin.Result<T>): kotlin.Unit
}
其实本质上也是callback的方式,只是换成了Continuation,继续连续,通过resumeWith来恢复。
Continuation是继续执行后后面的意思,继续做接下来没做完的事情。
其实就是状态机的状态label在记录状态,label=0之后就完成了所有的逻辑。
5.协程+MVVM+Jecpack项目架构
5.1Google Jecpack+MVVM架构设计
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iBCM0Ahe-1652886827099)(C:/Users/刘静盼/AppData/Roaming/Typora/typora-user-images/image-20220518224600055.png)]
Activity、Fragment通过ViewModel解决数据跟View耦合的问题,将逻辑拆分到几个不同的model中去,只需要关心数据的变化就可以,采用数据驱动UI的方式,Activity需要再处理View的刷新逻辑,只需要绑定ViewModel就可以。
ViewModel获取数据,如果是本地数据直接获取Room数据库的数据。
如果是网络数据,直接通过retrofit请求网络。
5.2.协程+Retrofit+MVVM+DataBinding
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WXvKAaqc-1652886827100)(https://gitee.com/weifeng_xixi/images/raw/master/img/image-20220518224303769.png)]
- 通过Retrofit对网络接口封装并添加协程挂起suspend关键字,完成所有API接口。
- 通过Repository仓库,对数据进行统一管理,暴露给ViewModle层。
- ViewModel获取到数据之后通过DataBinding直接通过数据变化完成了页面的刷新。
- 协程的作用就是不需要接口进行回调了。
Android Kotlin-协程相关推荐
- Android Kotlin协程和Retrofit结合使用
转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/118085035 本文出自[赵彦军的博客] 往期精彩文章: Kotlin实战指南二十 ...
- Android - kotlin 协程极简入门
背景 协程的作用是解决并发,并发的常见场景是多线程. "并发"和"并行"经常弄混.下面是我的理解,当然我理解也不一定是对的 "并发"是宏观上 ...
- Android Kotlin 协程async
转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/118093646 本文出自[赵彦军的博客] 往期精彩文章 Android Corou ...
- Android Kotlin + 协程 + Retrofit + MVVM优雅的实现网络请求(简洁!!!!)
最近学习了Kotlin,感受就是好处太多了 欲罢不能,这其中协程这个特点处理异步非常不错,于是花了很长时间结合Retrofit封装了网络请求,感觉非常简洁好用.先看下调用方式 准备工作:Retrofi ...
- 在 Android 开发中使用 Kotlin 协程 (一) -- 初识 Kotlin 协程
前言 最近在研究 Kotlin 协程,发现功能真的超级强大,很有用,而且很好学,如果你正在或计划使用 Kotlin 开发 Android,那么 Kotlin 协程你一定不能错过! 协程是什么? 我们平 ...
- android 协程,Android 上的 Kotlin 协程
协程是一种并发设计模式,您可以在 Android 平台上使用它来简化异步执行的代码.协程是在版本 1.3 中添加到 Kotlin 的,它基于来自其他语言的既定概念. 在 Android 上,协程有助于 ...
- 【Kotlin 协程】Flow 异步流 ② ( 使用 Flow 异步流持续获取不同返回值 | Flow 异步流获取返回值方式与其它方式对比 | 在 Android 中使用 Flow 异步流下载文件 )
文章目录 一.使用 Flow 异步流持续获取不同返回值 二.Flow 异步流获取返回值方式与其它方式对比 三.在 Android 中 使用 Flow 异步流下载文件 一.使用 Flow 异步流持续获取 ...
- 大型Android项目架构:基于组件化+模块化+Kotlin+协程+Flow+Retrofit+Jetpack+MVVM架构实现WanAndroid客户端
前言:苟有恒,何必三更眠五更起:最无益,莫过一日曝十日寒. 前言 之前一直想写个 WanAndroid 项目来巩固自己对 Kotlin+Jetpack+协程 等知识的学习,但是一直没有时间.这里重新行 ...
- 分享Android KTX + Kotlin协程 组合使用
在android中请求权限,一般使用requestPermissions和onRequestPermissionsResult组合使用来完成. 但是这种方式有个很大的弊端,会让代码分割导致代码可读性变 ...
- 【Kotlin 协程】协程简介 ( 协程概念 | 协程作用 | 创建 Android 工程并进行协程相关配置开发 | 异步任务与协程对比 )
文章目录 一.协程概念 二.协程作用 三.创建 Android 工程并进行协程相关配置 1.创建 Android 工程 2.配置协程环境 3.布局文件 4.异步任务代码示例 5.协程代码示例 6.完整 ...
最新文章
- 将Doc或者Docx文档处理成html的代码逻辑;统计word中的字数,段数,句数,读取word中文档内容的代码逻辑...
- 米斯特白帽培训讲义 漏洞篇 弱口令、爆破、遍历
- error LNK2001: 无法解析的外部符号unresolved external symbol __imp__JNI_CreateJavaVM@12
- 行如风 Angular初识
- 数学建模matlab视频教程,matlab编程教程_求matlab视频教程,主要用于数学建模方面的...
- 2012最热门软件游戏下载Top搜集(热门影音,游戏,办公软件大集合)
- pid控制算法c语言,PID控制算法的C语言实现(三)
- 你的功夫真的夠了嗎?
- 看到强烈的太阳光你会不由自主的打喷嚏吗?
- 计算机睡眠伤硬盘,放开那块硬盘!聊聊Win8伤盘那些事
- Office 365绝技系列:3分钟完成PPT设计排版
- 计算机网络机房自查报告,银行机房自查报告
- 如何在线编辑Office文档
- 【论文解读|2019】HAHE - Hierarchical Atentive Heterogeneous Information Network Embedding
- python中if条件语句的代码实例
- JavaWbe\Response下载文件\Response验证码练习
- 哈工大计算机学院刘明,哈工大机电工程学院机械工程专业导师介绍:刘明(2)
- 两边向中间打印(C语言)
- python画糖果_币乎糖果空投算法解析(python)-2
- 中文正则表达式匹配 正则中文匹配
热门文章
- python生成exe启动很慢_python生成exe启动很慢|Win7电脑启动慢如何解决?Win7使用Msconfig.exe解决电脑启动慢的方法...
- Testin云测荣获5G应用企业服务优秀平台奖
- 酷爱到碗里来+文蛤蒸蛋
- 亲脂性细胞膜染料: DiO, Dil, DiR, Did - MedChemExpress
- 浅谈面试与简历——总结于尚硅谷视频《程序员面试指南》
- 计算机启动后没有桌面,电脑开机后桌面上什么都没有是为什么,怎么办
- 一文看懂线性回归和非线性回归
- 文成小盆友python-num14 - web 前端基础 html ,css, JavaScript
- python棋牌游戏开发之斗地主
- _variant_t数据类型