| 知乎专栏 |
GlobeScope:全局范围,不会自动结束执行。 MainScope: 主线程的作用域,全局范围 lifecycleScope:生命周期范围,用于activity等有生命周期的组件,在onDestroy的时候会自动结束。 viewModelScope:viewModel范围,用于ViewModel中,在ViewModel被回收时会自动结束
GlobalScope.launch {
while (true) {
delay(1000)
println("每秒执行一次")
}
}
GlobalScope.launch {
//GlobalScope开启协程:DefaultDispatcher-worker-1
Log.d(TAG, "GlobalScope开启协程:" + Thread.currentThread().name)
//子线程中此处不可以做UI操作
withContext(Dispatchers.Main){
Toast.makeText(this@MainActivity, "协程中切换线程", Toast.LENGTH_SHORT).show()
}
}
GlobalScope.launch(Dispatchers.Main) {
//GlobalScope开启协程:main
Log.d(TAG, "GlobalScope开启协程:" + Thread.currentThread().name)
//可以做UI操作
Toast.makeText(this@MainActivity, "GlobalScope开启协程", Toast.LENGTH_SHORT).show()
}
GlobalScope.launch(Dispatchers.IO) {
if (AndroidManager.Device.scanMicrophone() && !State.usbMicrophone.get()) {
aigcSpeech.speaking("蓝牙麦克风连接")
}
Log.d(TAG, "Bluetooth connected")
}
val job = GlobalScope.launch(start = CoroutineStart.LAZY) {
Log.w("执行在协程中...")
delay(1000L)
Log.w("执行完毕...")
}
job.start()
var job: Job = Job()
...
GlobalScope.launch(job) {
Log.w("执行协程...")
delay(1000L)
Log.w("执行完毕...")
}
override fun onDestroy() {
job.cancel()
super.onDestroy()
}
val exceptionHandler = CoroutineExceptionHandler { coroutineContext, throwable ->
Log.e(throwable.message ?: "Unkown Error")
}
val job = GlobalScope.launch(Dispatchers.Main + exceptionHandler) {
Log.w("执行协程...")
delay(1000L)
val num = 9/0
Log.w("协程执行完毕...")
}
job.invokeOnCompletion {
Log.w("完成或异常的回调")
}
MainScope().launch {
Log.w("执行协程")
val result = OtherTask {
async(Dispatchers.IO) {
"netkiller"
}.await()
}
Log.w("程执行完毕 $result")
}
lifecycleScope只能在Activity、Fragment中使用,会绑定Activity和Fragment的生命周期。使用的时候需要导
lifecycleScope默认主线程,可以通过withContext来指定线程
lifecycleScope.launch {
// do
withContext(Dispatchers.IO) {
// do
}
}
// or
lifecycleScope.launch(Dispatchers.IO){
// do
}
// or
lifecycleScope.launch {
whenResumed {
// do
}
}
// or
lifecycleScope.launchWhenResumed {
// do
}
lifecycleScope.launch{
delay(1000L)
}
lifecycleScope.launchWhenResumed {
delay(3000L)
}
private fun serialExecution() {
lifecycleScope.launch {
val startTime = System.currentTimeMillis()
val a = getDataA()
val b = getDataB()
val sum = a + b
//D/MainActivity: serialExecution: sum = 3,耗时:3008
Log.d(TAG, "serialExecution: sum = $sum,耗时:${System.currentTimeMillis() - startTime}")
}
}
private suspend fun getDataA(): Int {
delay(1000)
return 1
}
private suspend fun getDataB(): Int {
delay(2000)
return 2
}
private fun parallelExecution(){
lifecycleScope.launch {
val startTime = System.currentTimeMillis()
val a = lifecycleScope.async { getDataA() }
val b = lifecycleScope.async { getDataB() }
val sum = a.await() + b.await()
//D/MainActivity: parallelExecution: sum = 3,耗时:2009
Log.d(TAG, "parallelExecution: sum = $sum,耗时:${System.currentTimeMillis() - startTime}")
}
}
private suspend fun getDataA(): Int {
delay(1000)
return 1
}
private suspend fun getDataB(): Int {
delay(2000)
return 2
}
协程嵌套时取消协程,GlobalScope与MainScope 并不会杯取消。
val job = CoroutineScope(Dispatchers.Main).launch {
async(Dispatchers.IO) {
Log.w("协程async开始")
delay(5000)
Log.w("协程async执行完毕")
}
launch {
Log.w("协程launch开始")
delay(2000)
Log.w("协程launch执行完毕")
}
GlobalScope.launch {
Log.w("协程GlobalScope开始")
delay(3000)
Log.w("协程GlobalScope执行完毕")
}
MainScope().launch {
Log.w("协程MainScope开始")
delay(4000)
Log.w("协程MainScope执行完毕")
}
}
override fun onDestroy() {
super.onDestroy()
job.cancel()
}
val job = CoroutineScope(Dispatchers.Main).launch {
async(Dispatchers.IO) {
Log.w("协程async开始")
delay(5000)
Log.w("协程async执行完毕")
}
launch {
Log.w("协程launch开始")
delay(2000)
Log.w("协程launch执行完毕")
}
GlobalScope.launch {
Log.w("协程GlobalScope开始")
delay(3000)
Log.w("协程GlobalScope执行完毕")
}
MainScope().launch(job!!) {
Log.w("协程MainScope开始")
delay(4000)
Log.w("协程MainScope执行完毕")
}
}
override fun onDestroy() {
super.onDestroy()
job.cancel()
}