启明办公

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 92|回复: 0

Android-协程作用域

[复制链接]

1

主题

8

帖子

5

积分

新手上路

Rank: 1

积分
5
发表于 2022-9-23 09:09:33 | 显示全部楼层 |阅读模式
一、协程作用域构建器

1、coroutineScoperunBlocking
1)runBlocking是常规函数,而coroutineScope是挂起函数;
2)它们都会等待其协程体以及所有子协程结束,主要区别在于runBlocking方法会阻塞当前线程来等待,而coroutineScope只是挂起,会释放底层线程用于其他用途。
2、coroutineScopesupervisorScope
1)coroutineScope:一个协程失败了,所有其他兄弟协程也会被取消;
2)supervisorScope:一个协程失败了,不会影响其他兄弟协程。
二、coroutineScope

    /**
     * 测试协程作用域构建器
     */
    @Test
    fun testCoroutineScopeBuilder() = runBlocking {
        coroutineScope {
            val job1 = launch {
                delay(400)
                println("job1 完成了")
            }

            val job2 = async {
                delay(200)
                println("job2 完成了")
                "job2 返回值"
//                throw IllegalArgumentException("我是协程2抛出的异常")
            }

        }

执行结果:
09-12 17:16:36.635 11673 11695 I System.out: job2 完成了
09-12 17:16:36.837 11673 11695 I System.out: job1 完成了三、coroutineScope (子协程抛异常)

    /**
     * 测试协程作用域构建器(子协程抛出异常的状态)
     */
    @Test
    fun testCoroutineScopeBuilder1() = runBlocking {
        coroutineScope {
            val job1 = launch {
                delay(400)
                println("job1 完成了")
            }

            val job2 = async {
                delay(200)
                println("job2 完成了")
                "job2 返回值"
                throw IllegalArgumentException("我是协程2抛出的异常")
            }

        }
    }

执行结果:
09-12 17:19:37.314 11902 11924 I System.out: job2 完成了
09-12 17:19:37.317 11902 11924 E TestRunner: failed: testCoroutineScopeBuilder1(com.young.testcoroutine.CoroutineTest04)
09-12 17:19:37.317 11902 11924 E TestRunner: ----- begin exception -----
09-12 17:19:37.318 11902 11924 E TestRunner: java.lang.IllegalArgumentException: 我是协程2抛出的异常
09-12 17:19:37.318 11902 11924 E TestRunner:         at com.young.testcoroutine.CoroutineTest04$testCoroutineScopeBuilder1$1$1$job2$1.invokeSuspend(CoroutineTest04.kt:52)
09-12 17:19:37.318 11902 11924 E TestRunner:         at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33)
09-12 17:19:37.318 11902 11924 E TestRunner:         at kotlinx.coroutines.DispatchedTaskKt.resume(DispatchedTask.kt:227)
09-12 17:19:37.318 11902 11924 E TestRunner:         at kotlinx.coroutines.DispatchedTaskKt.dispatch(DispatchedTask.kt:166)
09-12 17:19:37.318 11902 11924 E TestRunner:         at kotlinx.coroutines.CancellableContinuationImpl.dispatchResume(CancellableContinuationImpl.kt:362)
09-12 17:19:37.318 11902 11924 E TestRunner:         at kotlinx.coroutines.CancellableContinuationImpl.resumeImpl(CancellableContinuationImpl.kt:396)
09-12 17:19:37.318 11902 11924 E TestRunner:         at kotlinx.coroutines.CancellableContinuationImpl.resumeImpl$default(CancellableContinuationImpl.kt:388)
09-12 17:19:37.318 11902 11924 E TestRunner:         at kotlinx.coroutines.CancellableContinuationImpl.resumeUndispatched(CancellableContinuationImpl.kt:484)
09-12 17:19:37.318 11902 11924 E TestRunner:         at kotlinx.coroutines.EventLoopImplBase$DelayedResumeTask.run(EventLoop.common.kt:489)
09-12 17:19:37.318 11902 11924 E TestRunner:         at kotlinx.coroutines.EventLoopImplBase.processNextEvent(EventLoop.common.kt:274)
09-12 17:19:37.318 11902 11924 E TestRunner:         at kotlinx.coroutines.BlockingCoroutine.joinBlocking(Builders.kt:84)
09-12 17:19:37.318 11902 11924 E TestRunner:         at kotlinx.coroutines.BuildersKt__BuildersKt.runBlocking(Builders.kt:59)
09-12 17:19:37.318 11902 11924 E TestRunner:         at kotlinx.coroutines.BuildersKt.runBlocking(Unknown Source:1)
09-12 17:19:37.318 11902 11924 E TestRunner:         at kotlinx.coroutines.BuildersKt__BuildersKt.runBlocking$default(Builders.kt:38)
09-12 17:19:37.318 11902 11924 E TestRunner:         at kotlinx.coroutines.BuildersKt.runBlocking$default(Unknown Source:1)
09-12 17:19:37.318 11902 11924 E TestRunner:         at com.young.testcoroutine.CoroutineTest04.testCoroutineScopeBuilder1(CoroutineTest04.kt:41)
09-12 17:19:37.318 11902 11924 E TestRunner:         at java.lang.reflect.Method.invoke(Native Method)
09-12 17:19:37.318 11902 11924 E TestRunner:         at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
09-12 17:19:37.318 11902 11924 E TestRunner:         at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
09-12 17:19:37.318 11902 11924 E TestRunner:         at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
09-12 17:19:37.318 11902 11924 E TestRunner:         at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
09-12 17:19:37.318 11902 11924 E TestRunner:         at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
09-12 17:19:37.318 11902 11924 E TestRunner:         at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
09-12 17:19:37.318 11902 11924 E TestRunner:         at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
09-12 17:19:37.318 11902 11924 E TestRunner:         at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
09-12 17:19:37.318 11902 11924 E TestRunner:         at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
09-12 17:19:37.318 11902 11924 E TestRunner:         at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
09-12 17:19:37.318 11902 11924 E TestRunner:         at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
09-12 17:19:37.318 11902 11924 E TestRunner:         at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
09-12 17:19:37.318 11902 11924 E TestRunner:         at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
09-12 17:19:37.318 11902 11924 E TestRunner:         at org.junit.runners.Suite.runChild(Suite.java:128)
09-12 17:19:37.318 11902 11924 E TestRunner:         at org.junit.runners.Suite.runChild(Suite.java:27)
09-12 17:19:37.318 11902 11924 E TestRunner:         at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
09-12 17:19:37.318 11902 11924 E TestRunner:         at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
09-12 17:19:37.318 11902 11924 E TestRunner:         at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
09-12 17:19:37.318 11902 11924 E TestRunner:         at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
09-12 17:19:37.318 11902 11924 E TestRunner:         at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
09-12 17:19:37.318 11902 11924 E TestRunner:         at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
09-12 17:19:37.318 11902 11924 E TestRunner:         at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
09-12 17:19:37.318 11902 11924 E TestRunner:         at org.junit.runner.JUnitCore.run(JUnitCore.java:115)
09-12 17:19:37.318 11902 11924 E TestRunner:         at androidx.test.internal.runner.TestExecutor.execute(TestExecutor.java:56)
09-12 17:19:37.318 11902 11924 E TestRunner:         at androidx.test.runner.AndroidJUnitRunner.onStart(AndroidJUnitRunner.java:444)
09-12 17:19:37.318 11902 11924 E TestRunner:         at android.app.Instrumentation$InstrumentationThread.run(Instrumentation.java:2205)
09-12 17:19:37.318 11902 11924 E TestRunner: ----- end exception -----
09-12 17:19:37.321 11902 11924 I TestRunner: finished: testCoroutineScopeBuilder1(com.young.testcoroutine.CoroutineTest04)

四、supervisorScope(子协程抛异常)

    /**
     * 测试 supervisorScope
     */
    @Test
    fun testSupervisorScopeBuilder() = runBlocking {
        supervisorScope {
            val job1 = launch {
                delay(400)
                println("job1 完成了")
            }

            val job2 = async {
                delay(200)
                println("job2 完成了")
                "job2 返回值"
                throw IllegalArgumentException("我是协程2抛出的异常")
            }

        }
    }

执行结果:
09-12 17:27:18.841 12131 12153 I System.out: job2 完成了
09-12 17:27:19.041 12131 12153 I System.out: job1 完成了
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|启明办公

Copyright © 2001-2013 Comsenz Inc.Template by Comsenz Inc.All Rights Reserved.

Powered by Discuz!X3.4

快速回复 返回顶部 返回列表