1 它是什么(协程 和 Kotlin协程)
1.1 协程是什么
维基百科:协程,英文Coroutine [kəru’tin] (可入厅),是计算机程序的一类组件,推广了协作式多任务的子程序,允许执行被挂起与被恢复。
作为Google钦定的Android开发首选语言Kotlin,协程并不是 Kotlin 提出来的新概念,目前有协程概念的编程语言有Lua语言、Python语言、Go语言、C语言等,它只是一种编程思想,不局限于特定的语言。
而每一种编程语言中的协程的概念及实现又不完全一样,本次分享主要讲Kotlin协程。
1.2 Kotlin协程是什么
Kotlin官网:协程是轻量级线程
可简单理解:一个线程框架,是全新的处理并发的方式,也是Android上方便简化异步执行代码的方式
类似于 Java:线程池 Android:Handler和AsyncTask,RxJava的Schedulers
注:Kotlin不仅仅是面向JVM平台的,还有JS/Native,如果用kotlin来写前端,那Koltin的协程就是JS意义上的协程。如果仅仅JVM 平台,那确实应该是线程框架。
1.3 进程、线程、协程比较
可通过以下两张图理解三者的不同和关系
2 为什么选择它(协程解决什么问题)
异步场景举例:
- 第一步:接口获取当前用户token及用户信息
- 第二步:将用户的昵称展示界面上
- 第三步:然后再通过这个token获取当前用户的消息未读数
- 第四步:并展示在界面上
2.1 现有方案实现
apiService.getUserInfo().enqueue(object :Callback<User>{
override fun onResponse(call: Call<User>, response: Response<User>) {
val user = response.body()
tvNickName.text = user?.nickName
apiService.getUnReadMsgCount(user?.token).enqueue(object :Callback<Int>{
override fun onResponse(call: Call<Int>, response: Response<Int>) {
val tvUnReadMsgCount = response.body()
tvMsgCount.text = tvUnReadMsgCount.toString()
}
})
}
})
现有方案如何拿到异步任务的数据,得不到就毁掉哈哈哈,就是通过回调函数来解决。
若嵌套多了,这种画风是不是有点回调地狱的感觉,俗称的「callback hell」
2.2 协程实现
ma