Kotlin协程基础篇

什么是协程

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 = 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 协程到底运行在哪个线程里

初学,欢迎批评指正!!
喵印~~~

你可能感兴趣的:(Kotlin协程基础篇)