Kotlin协程基础篇
2020-09-25 本文已影响0人
蓝库知识
什么是协程
kotlin中的线程框架,是对线程的上层封装,可同步代码实现异步操作。
什么时候用
1.切换线程或者指定线程
2.并发逻辑处理
如何启动协程
1.launch函数
var job = GlobalScope.launch() {
Log.d("tina=====>", Thread.currentThread().name)//结果:DefaultDispatcher-workver-1
getData();
}
实验结果launch默认是在工作线程的,所以不会阻塞线程
2.runBlocking,线程切到协程的时候用
runBlocking {
Log.d("tina=====>", Thread.currentThread().name)//结果:main
getData();
}
实验结果runBlocking工作在主线程,可以更新UI
3.async函数,相比于landch,它是带返回值的
runBlocking {
var data: Deferred<String> = GlobalScope.async {
"eeeee"
}
log("data是啥${data.await()}")
}
如何线程切换 Dispatchers
种类:
Dispatchers.Default 共享后台线程池里的线程
Dispatchers.Main Android主线程
Dispatchers.IO 共享后台线程池里的线程
Dispatchers.Unconfined 不限制,使用父Coroutine的现场
newSingleThreadContext 使用新的线程
var job = GlobalScope.launch() {
var data = getData()
withContext(Dispatchers.Main) {//切换到主线程
main_tv_back.text = data
}
}
suspend fun getData(): String {
delay(5000)
return "text"
}
如果在主线程调用suspend挂起函数,还是推荐将切换到io或者工作线程的操作写在suspend函数中,毕竟整洁一点哈哈哈
补充一句,上面getData()挂起函数,之所以没有切线程,是因为launch不会阻塞线程,所以认为就不用切
suspend fun getData(): String {
withContext(Dispatchers.IO){
delay(5000)
}
return "text"
}
suspend函数
挂起函数,暂时理解成一种标志吧,反编译发现有一个回调的用的参数,可以实现线程切回来的操作
非阻塞式挂起
以非阻塞的形式执行阻塞式的代码
挂起
就是切线程,由当前线程挂起,当前线性继续执行任务,被挂起的协程去另一个线程执行任务(看你切到哪个线程了),执行完还可以再切回来(也可以不切回来)
资料参考
在 Android 开发中使用 Kotlin 协程 (一) -- 初识 Kotlin 协程
Kotlin 协程到底运行在哪个线程里
初学,欢迎批评指正!!
喵印~~~