kotlin: flow: 用flowon指定上游的线程池

一,代码:

        //处理按钮点击事件
        binding.button1.setOnClickListener {
            runBlocking {
                val flow = flow {
                    //logX("Start")
                    emit(1)
                    logX("Emit: 1")
                    emit(2)
                    logX("Emit: 2")
                    emit(3)
                    logX("Emit: 3")
                }
                //用flowOn指定上游的线程
                flow.filter {
                    logX("Filter: $it")
                    it > 2
                    }
                    .flowOn(Dispatchers.IO)  // 注意这里
                    .collect {
                        logX("Collect $it")
                    }
            }
        }


        //处理按钮点击事件
        binding.button2.setOnClickListener {
            runBlocking {
                val flow = flow {
                    //logX("Start")
                    emit(1)
                    logX("Emit: 1")
                    emit(2)
                    logX("Emit: 2")
                    emit(3)
                    logX("Emit: 3")
                }
                //用flowOn指定上游的线程
                flow.flowOn(Dispatchers.IO)  // 注意这里
                    .filter {
                    logX("Filter: $it")
                    it > 2
                    }
                    .collect {
                        logX("Collect $it")
                    }
            }
        }

当需要频繁切换工作的线程时,
对于耗时任务,我们需要线程池当中执行,
对于 UI 任务,我们需要在主线程执行。
flowOn可以用来实现线程的切换

注意点: flowOn 的作用域仅限于上游,
所以它只会让 flow{} 当中的代码运行在 DefaultDispatcher 当中,剩下的代码则执行在 main 线程

二,运行结果:

第一个按钮点击:

image

第二个按钮点击:

image

 

posted @ 2025-08-02 15:00  刘宏缔的架构森林  阅读(11)  评论(0)    收藏  举报