摘要:
一,实现接口 代码: 实义接口和实现类 // 定义接口 interface AnimalInterface { val name: String // 抽象方法 fun play() // 默认实现的方法 fun sleep() { println("睡觉中...") } } // 实现接口的类 c 阅读全文
posted @ 2025-08-02 15:06
刘宏缔的架构森林
阅读(10)
评论(0)
推荐(0)
摘要:
一,Job()作为父协程时,子协程的状态不会影响它的状态 代码: //处理按钮点击事件 binding.button1.setOnClickListener { runBlocking { val parentJob = Job() launch(parentJob) { // 使用新的 job 替 阅读全文
posted @ 2025-08-02 15:06
刘宏缔的架构森林
阅读(7)
评论(0)
推荐(0)
摘要:
一,Job生命周期示意图: 状态的表格: 二,例子: 代码: //处理按钮点击事件 binding.button2.setOnClickListener { runBlocking { // Job 在创建后就是 Active 状态 val job = Job() println(job) // J 阅读全文
posted @ 2025-08-02 15:06
刘宏缔的架构森林
阅读(12)
评论(0)
推荐(0)
摘要:
一,cancel()和cancelAndJoin()两者的区别: cancel() 方法用于取消协程,但是它不会等待协程的结束,调用此方法后,协程可能会被中断,但并不保证它会立刻停止,尤其是在协程处于挂起状态时 cancelAndJoin() 方法不仅会取消协程,还会等待该协程完全终止。这意味着,调 阅读全文
posted @ 2025-08-02 15:06
刘宏缔的架构森林
阅读(29)
评论(0)
推荐(0)
摘要:
一,例一,用 CoroutineExceptionHandler处理协程异常 代码: //处理按钮点击事件 binding.button1.setOnClickListener { runBlocking { //定义异常处理handler val myExceptionHandler = Coro 阅读全文
posted @ 2025-08-02 15:06
刘宏缔的架构森林
阅读(12)
评论(0)
推荐(0)
摘要:
一,例一:用 SupervisorJob避免因异常崩溃 代码: //处理按钮点击事件 binding.button1.setOnClickListener { runBlocking { val scope = CoroutineScope(SupervisorJob()) scope.async 阅读全文
posted @ 2025-08-02 15:06
刘宏缔的架构森林
阅读(26)
评论(0)
推荐(0)
摘要:
一,例子一 代码: //处理按钮点击事件 binding.button1.setOnClickListener { runBlocking { try { launch { delay(100L) 1 / 0 // 故意制造异常 } } catch (e: ArithmeticException) 阅读全文
posted @ 2025-08-02 15:06
刘宏缔的架构森林
阅读(7)
评论(0)
推荐(0)
摘要:
一,例子一 代码:定义一个线程池 val fixedDispatcher = Executors.newFixedThreadPool(2) { Thread(it, "MyFixedThread").apply { isDaemon = false } }.asCoroutineDispatche 阅读全文
posted @ 2025-08-02 15:06
刘宏缔的架构森林
阅读(1)
评论(0)
推荐(0)
摘要:
一,例子一: 代码: //处理按钮点击事件 binding.button3.setOnClickListener { runBlocking { //(Dispatchers.Default) println("协程:${Thread.currentThread().name}") val job 阅读全文
posted @ 2025-08-02 15:06
刘宏缔的架构森林
阅读(14)
评论(0)
推荐(0)
摘要:
一,代码: //处理按钮点击事件 binding.button1.setOnClickListener { runBlocking { val job = launch { var i = 0 while (true) { Thread.sleep(500L) //delay(500L) i ++ 阅读全文
posted @ 2025-08-02 15:06
刘宏缔的架构森林
阅读(18)
评论(0)
推荐(0)
摘要:
一,例子一: 代码: //处理按钮点击事件 binding.button1.setOnClickListener { runBlocking { val job = launch(Dispatchers.Default) { var i = 0 while (true) { Thread.sleep 阅读全文
posted @ 2025-08-02 15:00
刘宏缔的架构森林
阅读(10)
评论(0)
推荐(0)
摘要:
一,代码: 自定义线程 val myCustomDispatcher1 = newSingleThreadContext("MyCustomThread1") 调用 //处理按钮点击事件 binding.button1.setOnClickListener { runBlocking { val f 阅读全文
posted @ 2025-08-02 15:00
刘宏缔的架构森林
阅读(15)
评论(0)
推荐(0)
摘要:
一,代码: //处理按钮点击事件 binding.button1.setOnClickListener { runBlocking { val flow = flow { //logX("Start") emit(1) logX("Emit: 1") emit(2) logX("Emit: 2") 阅读全文
posted @ 2025-08-02 15:00
刘宏缔的架构森林
阅读(15)
评论(0)
推荐(0)
摘要:
一,代码: //处理按钮点击事件 binding.button1.setOnClickListener { runBlocking { //用 try catch 处理下游异常 flowOf(4, 5, 6) .onCompletion { println("onCompletion: $it") 阅读全文
posted @ 2025-08-02 15:00
刘宏缔的架构森林
阅读(12)
评论(0)
推荐(0)
摘要:
一,代码: //处理按钮点击事件: 异常位于catch上游 binding.button1.setOnClickListener { runBlocking { val flow = flow { emit(1) emit(2) throw IllegalStateException() emit( 阅读全文
posted @ 2025-08-02 15:00
刘宏缔的架构森林
阅读(10)
评论(0)
推荐(0)
摘要:
一,代码: //处理按钮点击事件 binding.button1.setOnClickListener { runBlocking { // Flow转List flowOf(1, 2, 3, 4, 5) .toList() .filter { it > 2 } .map { it * 2 } .t 阅读全文
posted @ 2025-08-02 15:00
刘宏缔的架构森林
阅读(14)
评论(0)
推荐(0)
摘要:
一,代码: //处理按钮点击事件 binding.button2.setOnClickListener { runBlocking { flowOf(1, 2, 3, 4, 5) .take(2) // 注意这里 .filter { println("filter: $it") it > 2 } . 阅读全文
posted @ 2025-08-02 15:00
刘宏缔的架构森林
阅读(15)
评论(0)
推荐(0)
摘要:
一,代码: //处理按钮点击事件 binding.button1.setOnClickListener { runBlocking { flow { // 上游,发源地 emit(1) // 挂起函数 emit(2) emit(3) emit(4) emit(5) }.filter { printl 阅读全文
posted @ 2025-08-02 15:00
刘宏缔的架构森林
阅读(7)
评论(0)
推荐(0)
摘要:
一,代码: 例子:需要访问缓存和网络来获取数据,如果从缓存先返回,先更新ui,从网络获取数据后再更新一次,如果从网络先返回,更新ui 数据类: data class Product( //id val productId: String, //价格 val price: Double, // 是不是 阅读全文
posted @ 2025-08-02 15:00
刘宏缔的架构森林
阅读(8)
评论(0)
推荐(0)
摘要:
一,代码: 自定义dispatcher: 自定义了两个dispatcher val myCustomDispatcher1 = newSingleThreadContext("MyCustomThread1") val myCustomDispatcher2= Executors.newSingle 阅读全文
posted @ 2025-08-02 15:00
刘宏缔的架构森林
阅读(46)
评论(0)
推荐(0)
浙公网安备 33010602011771号