Kotlin协程之flow工作原理,2024最新Android大厂面试题来袭

  • Kotlin协程之协程取消与异常处理

首先看一下 Flow 接口的源码,内部只有一个 collect 方法:

public interface Flow {
// 是一个 suspend 方法,意味着会挂起当前协程
@InternalCoroutinesApi
public suspend fun collect(collector: FlowCollector)
}

public interface FlowCollector {
// 数据的发射方
public suspend fun emit(value: T)
}

flow {}

以下面代码为例,讲解 flow 工作的基本流程:

flow { emit(1) }.collect { println(it) }

首先看一下 flow {} 的源码:

public fun flow(@BuilderInference block: suspend FlowCollector.() -> Unit): Flow = SafeFlow(block)

上面就是以 block 代码块为参数创建了一个 SafeFlow 对象,SafeFlow 实现了 Flow 接口,于是接着看其 collect 方法。

collect

除了一开始贴的实现 Flow 接口调用 collect 方法的方式, Kotlin 还提供了调用 collect 的两个扩展函数,最后都是调用的 fun collect(collector: FlowCollector) 方法:

public suspend fun Flow<*>.collect(): Unit = collect(NopCollector)

public suspend inline fun Flow.collect(crossinline action: suspend (value: T) -> Unit): Unit =
collect(object : FlowCollector {
override suspend fun emit(value: T) = action(value)
})

于是我们接着上面的示例,看一下 SafeFlow.collect 方法:

private class SafeFlow(private val block: suspend FlowCollector.() -> Unit) : AbstractFlow() {
override suspend fun collectSafely(collector: FlowCollector) {
collector.block()
}
}

// collect 方法在父类 AbstractFlow 中
public abstract class AbstractFlow : Flow, CancellableFlow {
public f

你可能感兴趣的:(Android程序员,android,kotlin,开发语言)