开篇的话
这一篇更多的偏向于协程的概念和他的定义等,更多的算是一个知识背景的介绍,如果只是想看如何使用,可以跳过这一篇。
1、协程是什么:协程是基于线程的,是轻量级的线程。他更多的是和Kotlin进行配合使用的。
coroutine=cooperation +routine things 大体意思是指日常事务的组合。
2、安卓中为什么引入协程:
a)首先,协程是用来处理耗时任务的。
b)其次,协程可以保证主线程安全,可以保证安全的从主线程调用任何suspend函数。(因为耗时任务常常会阻塞主线程)
c)再有,安卓11google官方,已经不推荐使用AsyncTask异步任务,而是推荐使用协程。
3、协程可以解决多个回调嵌套,而造成回调地狱的问题。
例如变态需求场景:
首先需要请求APP更新接口,如果是最新版本,则请求用户信息接口,如果是新注册用户用户,则请求新人奖励类型接口,如果发放的新人奖励是会员时长,则请求新人奖励的具体展示信息。
这里涉及到需要顺序调用4个接口(不考虑设计是否合理,单纯列举场景)。如果使用AsyncTask。就会出现回调嵌套回调。造成代码的后期维护性降低。
而协程可以通过顺序调用的方式,类似于同步执行的方式。更符合人类的阅读习惯。
举例如下:
使用回调,造成地狱回调的情况
object : AsyncTask<Void,Void,Int>(){
override fun doInBackground(vararg p0: Void?): Int {
return API.requestAppVersion("1.0.1")
}
override fun onPostExecute(result: Int?) {
super.onPostExecute(result)
object : AsyncTask<Void,Void,Int>(){
override fun doInBackground(vararg p0: Void?): Int {
return API.requestUserInfo("admin")
}
override fun onPostExecute(result: Int?) {
super.onPostExecute(result)
object : AsyncTask<Void,Void,Int>(){
override fun doInBackground(vararg p0: Void?): Int {
return API.requestGiftType("admin")
}
override fun onPostExecute(result: Int?) {
super.onPostExecute(result)
}
}.execute()
}
}.execute()
}
}.execute()
GlobalScope.launch {
val requestAppVersion = API.requestAppVersion("1.0.1")
if (requestAppVersion==0) {
val userInfo = API.requestUserInfo("admin")
if (userInfo==NewUser){
val giftType = API.requestGiftType("")
}
}
}
通过上面的代码,可以看出,协程的方式,减少了需要处理异步回调的情况,更多的类似于同步的变成。不用考虑耗时任务的处理,更加简便,易于理解。
4、协程最重要的就是将异步逻辑同步化,杜绝了嵌套回调。
而协程的最核心的内容就是,函数的挂起和恢复。
下一篇将会说明如何使用Coroutine