/**
* CoroutineScope.async {}可以实现与 launch builder 一样的效果,在后台创建一个新协程,唯一的区别是它有返回值,因为CoroutineScope.async {}返回的是 Deferred 类型。
*/
private suspend fun testwithContextAsnyc() {
withContext(Dispatchers.IO) {
val deferred1 = async { getData1() }
val deferred2 = async { getData2() }
Log.d("xg", "${deferred1.await()} / ${deferred2.await()}")
}
}
/**
* 因为 GlobalScope 创建的协程没有父协程,除非执行完成或手动取消,该协程都会继续运行,
* 而实际上在 Android 中协程的运行需要跟 Activity/Fragment 的生命周期绑定
* viewLifecycleOwner.lifecycleScope.launch {//生命周期期间
在这里执行无效,fragment 退出接着执行
}
*/
private fun testGlobalScope() {
GlobalScope.launch(Dispatchers.IO) {
// 创建一个新协程
val deferred1 = getData1()
val deferred2 = getData2()
Log.d("xg", "$deferred1 / $deferred2")
Log.d("xg", "${Thread.currentThread().name}")
// 需要异常处理,直接加上 try/catch 语句即可
}
}
/**
* withContext不会创建新的协程,在指定协程上运行挂起代码块Dispatchers.IO,并挂起该协程直至代码块运行完成。
*/
private suspend fun testwithContext() {
withContext(Dispatchers.IO) {
val deferred1 = getData1()
val deferred2 = getData2()
Log.d("xg", "${deferred1} / ${deferred2}")
}
}
suspend fun getData1(): String {
//延时10秒
delay(10000)
return "deferred1deferred1deferred1"
}
suspend fun getData2(): String {
//延时1秒
delay(1000)
return "deferred2deferred2deferred2"
}
/**
* suspend声明 提醒我是耗时操作,挂起函数
* 挂起函数 必须在挂起函数中执行(CoroutineScope.launch 或者声明suspend ),因为他属于协成的 ,
* 挂起函数 也就是新起一个线程,执行结束后再切回来原来的线程
* withContext才是线程切换的执行的代码入口,
挂起函数挂起当前协程,直到异步协程完成执行,但是这里并没有阻塞线程,是使用状态机的控制逻辑来实现。
而且挂起函数可以保证挂起点之后的代码一定在挂起点前代码执行完成后才会执行,挂起函数保证顺序执行,所以异步逻辑也可以用顺序的代码顺序来编写。
作者:JohnnyShieh
链接:https://www.jianshu.com/p/2979732fb6fb
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
*/
private suspend fun savePhoto() {
withContext(Dispatchers.IO) {
todo 耗时操作 例如图片上传
}
}
两个耗时操作执行,可并行,都结束后 再进行打印
private suspend fun testXiecheng() {
withContext(Dispatchers.IO) {
val deferred1 = async { getData1() }
val deferred2 = async { getData2() }
Log.d("xg", "${deferred1.await()} / ${deferred2.await()}")
}
}
或者这样执行
private fun testXiecheng1() {
GlobalScope.launch {
// 创建一个新协程
val deferred1 = getData1()
val deferred2 = getData2()
Log.d("xg", "$deferred1 / $deferred2")
}
}
suspend fun getData1(): String {
//延时10秒
delay(10000)
return "deferred1deferred1deferred1"
}
suspend fun getData2(): String {
//延时1秒
delay(1000)
return "deferred2deferred2deferred2"
}