上一篇讲了协程在并发中的使用,及其优势,链接放下面,有兴趣的可以去看看
https://developer.aliyun.com/article/999247?spm=a2c6h.13148508.setting.14.eeac4f0ey7vfMr
这篇文章我们来讲讲协程在Android 中的使用,其实用法更kotlin是一样的,感觉说了句废话,因为按照开发如果是使用kotlin语言的话,只要kotlin语言版本在1.3之后的,都具备协程功能。
还有一点是,需要添加一些依赖库,比如协程核心库、协程Android支持库、协程Java8支持库、以及lifecycle对于协程的扩展库。
// Kotlin
implementation "org.jetbrains.kotlin:kotlin-stdlib:1.4.32"
// 协程核心库
implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:1.4.3"
// 协程Android支持库
implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:1.4.3"
// 协程Java8支持库
implementation "org.jetbrains.kotlinx:kotlinx-coroutines-jdk8:1.4.3"
// lifecycle对于协程的扩展封装
implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.2.0"
implementation "androidx.lifecycle:lifecycle-runtime-ktx:2.2.0"
implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.2.0"
其中lifecycle对于协程的扩展库,主要是扩张Jetpack库,也就是我们前面文章讲到的,lifecycleScope跟viewModelScope,只有添加lifecycle对于协程的扩展库,才可以使用lifecycleScope跟viewModelScope
而对于lifecycleScope跟viewModelScope的使用,方法基本跟CoroutineScope一样,只不过是我们不需要去管理它们的生命周期,他们自动绑定了生命周期,当activity、fragment 销毁的时候,自动cancel掉。
lifecycleScope、viewModelScope的我多说几句,在activity、fragment中我们使用lifecycleScope,在viewModel中我们使用viewModelScope,用法两者一样,下面会给出例子
两者都可以在协程中调用withContext 或者 async(Dispatchers.IO){}。调用await函数(此函数为可挂起函数,等待IO线程结束,并返回执行结果),使用withContext时不需要await,因为withContext就是可挂起函数
他们的作用有一下几点:
1.普通异步处理,直接在协程中使用可挂起函数即可,无需切换到子线程
2.网络请求任务必须切换子线程,网络请求任务必须在子线程中执行,当然协程中也不例外!只不过它可以实现挂起而不阻塞主线程
3.async+await 约等于withContext
4.切换线程中任务执行完毕以后,协程会将线程自动切回原线程
lifecycleScope.launch{
val io = async(Dispatchers.IO){
//网络请求
//IO线程
}
io.await()
//主线程
//刷新UI
}
关于协程在Android中的使用就将这么多了,基本该讲的内容很多都在之前的文章讲过了,具体需求具体应用,我们只要知道的是,协程的特点及作用就行。
还是那两句话
用同步的方式去表达异步,这一点体现在并发上
协程异步就是将耗时的函数标记为suspend,并在协程中调用!不需要开启新线程,不会阻塞UI。
that‘s all.