Performing network request in Coroutine Process finished with exit code 0 现在让我们假设 delay() 代表一个网络请求,为了处理网络请求可能发生的异常,我们用 try-catch 代码块来捕获所有异常。 fun main() = runBlocking { val job = launch { try { printl
){super.onCreate(savedInstanceState)setContentView(R.layout.activity_main)GlobalScope.launch(Dispatchers.Main){getInfo()getInfoNoContext()Log.v("wuyue","我又切回来了 in thread "+Thread.currentThread().name)}}/**
协程中有两种类型的Job,如果我们平时启动协程时没有特意地通过CoroutineContext指定一个Job,那么使用launch/async方法启动协程时返回的Job它会产生异常传播,我们知道协程有一个父子的概念,例如启动一个协程1,在协程中继续启动协程2、协程3,那么协程1就是协程2、协程3的父协程,协程2、协程3就是协程1的子协程,每个协程...
在 Android 的 onCreate 方法中调用 launch 方法,并设置在 Main 线程中执行;然后通过 withContext 方法...
GlobalScope.launch()属于协程构建器Coroutine builders,Kotlin 中还有其他几种 Builders,负责创建协程: runBlocking:T 使用runBlocking顶层函数创建,会创建一个新的协程同时阻塞当前线程,直到协程结束。适用于main函数和单元测试 launch 创建一个新的协程,不会阻塞当前线程,必须在协程作用域中才可以调用。它返回的是一个该...
Exceptioninthread"main"java.lang.RuntimeException: RuntimeException Flow的类型 主要分为冷流和热流两种。 冷流(如Flow) 数据生产者与消费者绑定:冷流是懒惰的,数据只有在有消费者(collect)时才开始生产。这意味着每个新的消费者会触发一个新的数据流。
Log.e("demo", Thread.currentThread().name) delay(10000) println("!23") } } 1. 2. 3. 4. 5. 6. 7. 结构化并发 虽然协程使用起来很简单,当我们使用 GlobalScope.launch 时,我们会创建一个顶级协程,但是这样使用也不是我们所推荐的方式,特别是如果我们忘记了对新启动协程的引用,它还是会继续运行。
launch(dispatcher) { delay(1000) println("Single thread dispatcher") } CoroutineName CoroutineName是比较简单的结构,的构造方法可以传一个字符串用以指定协程的名字。协程的名字只有调试的意义,对于代码的运行没有任何影响。比如在调试的时候,或者在性能分析Profiling的时候,可以用名字更加方便的区分不同的协程,进而...
特意使用只有一个线程的线程池来当DispatcherMainScope().launch(Executors.newFixedThreadPool(1).asCoroutineDispatcher()) {val result = withContext(Dispatchers.IO) {Thread.sleep(10_000)println("I am running in ${Thread.currentThread()}")"Hello coroutines"}println("I am running in ${Thread....
"${Thread.currentThread().id}", msg ) } } // 输出如下 Time | Tag | CoroutineName | Dispatcher | Thread | Msg 2 | launch1 | TEST | | 11 | ori 7 | main1 | null | BlockingEventLoop@3cc8b7e6 | 11 | ori 1027 | launch2 | TEST | | 15 | 1000ori ...