跳转至

切换线程

所有scopeXX作用域内为主线程, 可直接更新视图

调度器

协程中的调度器实际上为线程池, 通过切换调度器可以切换到不同线程上

切换调度器

scopeNetLife(dispatcher = Dispatchers.IO) {
    tv.text = Get<String>(Api.PATH).await()
}

禁止的调度器

Dispatchers.Main.immediate会立即同步执行, 导致catch/finally函数无效

作用域内部切换

有时需开启新的线程处理耗时任务

scopeNetLife {
    tv.text = withIO {
        // 假设此处是一个IO读写阻塞任务
        return "读出结果"
    }
}
scopeNetLife(dispatcher = Dispatchers.IO) {
    tv.text = withMain {
        // 假设此处是一个IO读写阻塞任务
        return "读出结果"
    }
}
函数 描述
withMain 切换到主线程
withIO 切换到IO线程
withDefault 切换到子线程
withUnconfined 切换到无限制调度器, 其取决于上一个执行的线程切换
launch 无返回值的挂起函数, 可指定线程
async 有返回值的挂起函数, 通过await()返回值, 可指定线程
runMain 切换到主线程, 该函数不属于协程可以在任何地方调用
  • withXX() 协程阻塞挂起
  • launch()/async() 非阻塞执行, 两者区别是有无返回值