kotlin协程Job、CoroutineScope作用域,Android
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.util.Log
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.Job
import kotlinx.coroutines.delay
import kotlinx.coroutines.launch
class MainActivity : AppCompatActivity() {
var TAG = "fly"
var job: Job? = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
job = CoroutineScope(Dispatchers.IO).launch {
repeat(10) {
Log.d(TAG, "$it")
delay(2000)
}
}
job?.invokeOnCompletion {
Log.d(TAG, "invokeOnCompletion")
}
}
override fun onResume() {
super.onResume()
Log.d(TAG, "isActive=${job?.isActive}")
}
override fun onStop() {
super.onStop()
job?.cancel()
Log.d(TAG, "isCompleted=${job?.isCompleted}")
Log.d(TAG, "isCancelled=${job?.isCancelled}")
}
}
按返回键后:
若是纯kotlin:
import kotlinx.coroutines.*
fun main(args: Array<String>) {
val scope = CoroutineScope(Dispatchers.IO)
val job = scope.launch {
println("start")
foo()
delay(2000)
println("end")
}
Thread.sleep(1000)
scope.cancel()
}
suspend fun foo() {
withContext(Dispatchers.IO) {
println("foo")
}
}
start
foo
kotlin协程coroutineScope_zhangphil的博客-CSDN博客coroutineScope 创建独立协程作用域,直到所有启动的协程都完成后才结束自己。runBlocking 和 coroutineScope 很像,它们都需要等待内部所有相同作用域的协程结束后才会结束自己。两者主要区别是: runBlocking 阻塞当前线程,而 coroutineScope不会,coroutineScope会挂起并释放底层线程供其它协程使用。kotlin协程coroutineScope。https://blog.csdn.net/zhangphil/article/details/129265638kotlin协程runBlocking 阻塞线程_zhangphil的博客-CSDN博客runBlocking 内部启动的3个协程做耗时操作,从输出可以看到3个协程交叉并发执行,runBlocking 会等到3个协程执行结束后才退出,输出结果有明确先后顺序。runBlocking 会等待相同作用域的协程完成才退出runBlocking 本身阻塞线程,但内部运行的协程又非阻塞。kotlin的runBlocking 当内部相同作用域的所有协程都运行结束后,在 runBlocking 之后的代码才能执行, runBlocking 会阻塞所在线程。
https://blog.csdn.net/zhangphil/article/details/129263455