文章目录

  • 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-协程相关推荐

  1. Android Kotlin协程和Retrofit结合使用

    转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/118085035 本文出自[赵彦军的博客] 往期精彩文章: Kotlin实战指南二十 ...

  2. Android - kotlin 协程极简入门

    背景 协程的作用是解决并发,并发的常见场景是多线程. "并发"和"并行"经常弄混.下面是我的理解,当然我理解也不一定是对的 "并发"是宏观上 ...

  3. Android Kotlin 协程async

    转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/118093646 本文出自[赵彦军的博客] 往期精彩文章 Android Corou ...

  4. Android Kotlin + 协程 + Retrofit + MVVM优雅的实现网络请求(简洁!!!!)

    最近学习了Kotlin,感受就是好处太多了 欲罢不能,这其中协程这个特点处理异步非常不错,于是花了很长时间结合Retrofit封装了网络请求,感觉非常简洁好用.先看下调用方式 准备工作:Retrofi ...

  5. 在 Android 开发中使用 Kotlin 协程 (一) -- 初识 Kotlin 协程

    前言 最近在研究 Kotlin 协程,发现功能真的超级强大,很有用,而且很好学,如果你正在或计划使用 Kotlin 开发 Android,那么 Kotlin 协程你一定不能错过! 协程是什么? 我们平 ...

  6. android 协程,Android 上的 Kotlin 协程

    协程是一种并发设计模式,您可以在 Android 平台上使用它来简化异步执行的代码.协程是在版本 1.3 中添加到 Kotlin 的,它基于来自其他语言的既定概念. 在 Android 上,协程有助于 ...

  7. 【Kotlin 协程】Flow 异步流 ② ( 使用 Flow 异步流持续获取不同返回值 | Flow 异步流获取返回值方式与其它方式对比 | 在 Android 中使用 Flow 异步流下载文件 )

    文章目录 一.使用 Flow 异步流持续获取不同返回值 二.Flow 异步流获取返回值方式与其它方式对比 三.在 Android 中 使用 Flow 异步流下载文件 一.使用 Flow 异步流持续获取 ...

  8. 大型Android项目架构:基于组件化+模块化+Kotlin+协程+Flow+Retrofit+Jetpack+MVVM架构实现WanAndroid客户端

    前言:苟有恒,何必三更眠五更起:最无益,莫过一日曝十日寒. 前言 之前一直想写个 WanAndroid 项目来巩固自己对 Kotlin+Jetpack+协程 等知识的学习,但是一直没有时间.这里重新行 ...

  9. 分享Android KTX + Kotlin协程 组合使用

    在android中请求权限,一般使用requestPermissions和onRequestPermissionsResult组合使用来完成. 但是这种方式有个很大的弊端,会让代码分割导致代码可读性变 ...

  10. 【Kotlin 协程】协程简介 ( 协程概念 | 协程作用 | 创建 Android 工程并进行协程相关配置开发 | 异步任务与协程对比 )

    文章目录 一.协程概念 二.协程作用 三.创建 Android 工程并进行协程相关配置 1.创建 Android 工程 2.配置协程环境 3.布局文件 4.异步任务代码示例 5.协程代码示例 6.完整 ...

最新文章

  1. 将Doc或者Docx文档处理成html的代码逻辑;统计word中的字数,段数,句数,读取word中文档内容的代码逻辑...
  2. 米斯特白帽培训讲义 漏洞篇 弱口令、爆破、遍历
  3. error LNK2001: 无法解析的外部符号unresolved external symbol __imp__JNI_CreateJavaVM@12
  4. 行如风 Angular初识
  5. 数学建模matlab视频教程,matlab编程教程_求matlab视频教程,主要用于数学建模方面的...
  6. 2012最热门软件游戏下载Top搜集(热门影音,游戏,办公软件大集合)
  7. pid控制算法c语言,PID控制算法的C语言实现(三)
  8. 你的功夫真的夠了嗎?
  9. 看到强烈的太阳光你会不由自主的打喷嚏吗?
  10. 计算机睡眠伤硬盘,放开那块硬盘!聊聊Win8伤盘那些事
  11. Office 365绝技系列:3分钟完成PPT设计排版
  12. 计算机网络机房自查报告,银行机房自查报告
  13. 如何在线编辑Office文档
  14. 【论文解读|2019】HAHE - Hierarchical Atentive Heterogeneous Information Network Embedding
  15. python中if条件语句的代码实例
  16. JavaWbe\Response下载文件\Response验证码练习
  17. 哈工大计算机学院刘明,哈工大机电工程学院机械工程专业导师介绍:刘明(2)
  18. 两边向中间打印(C语言)
  19. python画糖果_币乎糖果空投算法解析(python)-2
  20. 中文正则表达式匹配 正则中文匹配

热门文章

  1. python生成exe启动很慢_python生成exe启动很慢|Win7电脑启动慢如何解决?Win7使用Msconfig.exe解决电脑启动慢的方法...
  2. Testin云测荣获5G应用企业服务优秀平台奖
  3. 酷爱到碗里来+文蛤蒸蛋
  4. 亲脂性细胞膜染料: DiO, Dil, DiR, Did - MedChemExpress
  5. 浅谈面试与简历——总结于尚硅谷视频《程序员面试指南》
  6. 计算机启动后没有桌面,电脑开机后桌面上什么都没有是为什么,怎么办
  7. 一文看懂线性回归和非线性回归
  8. 文成小盆友python-num14 - web 前端基础 html ,css, JavaScript
  9. python棋牌游戏开发之斗地主
  10. _variant_t数据类型