二、LiveData
2.1 Suspend → LiveData(liveData{ })
public fun <T> liveData( ? ? context: CoroutineContext = EmptyCoroutineContext,//区块所执行的协程上下文,默认+Main.immediate。 ? ? timeoutInMs: Long = DEFAULT_TIMEOUT,? ? ? ? //没有观察者后,多少毫秒后取消区块,默认5s。 ? ? @BuilderInference block: suspend LiveDataScope<T>.() -> Unit? ? ? ? //区块在LiveData被观察的时候执行 ): LiveData<T> |
class MyViewModel : ViewModel() {
//直接调用挂起函数赋值
val num1: LiveData<Int> = liveData { emit(getData()) }
//还可以指定线程,单独写耗时操作
val num2: LiveData<Int> = liveData(Dispatchers.IO) {
emit(5)
delay(1000)
emit(3)
}
//从另一个LivaData获取更新结果
val aa = MutableLiveData(10)
val bb = liveData{ emitSource(aa) }
suspend fun getData(): Int = withContext(Dispatchers.IO) { 3 }
}
2.2 Flow → LiveData(asLiveData)
public fun <T> Flow<T>.asLiveData( ? ? context: CoroutineContext = EmptyCoroutineContext,//区块所执行的协程上下文,默认+Main.immediate ? ? timeoutInMs: Long = DEFAULT_TIMEOUT????????//没有观察者后,多少毫秒后取消区块,默认5s ): LiveData<T> |
class MyViewModel : ViewModel() {
val num1: LiveData<Int> = liveData { DataSource().getDataFlow.collect { emit(it) } }
val num2: LiveData<Int> = DataSource().getDataFlow.asLiveData() //简写
}
class DataSource {
val getDataFlow: Flow<Int> = flow { repeat(3) { emit(it) } }
}
Lifecyle.repeatOnLifecyle( ) | 在生命周期达到指定状态时,自动创建并启动协程执行代码块,在生命周期低于该状态时,自动取消协程。 | Flow.flowWithLifecyle( ) | 内部基于上一个。 |
三、Flow
3.1 Callback → Flow(callbackFlow)
底层使用的ChannelFlow。
send | 发送数据。 | offer | 允许在协程外提交。 | sendBlocking | 尝试用offer,失败则用runBlocking{ send() }阻塞式提交。 | awaitClose | Flow关闭时执行,用来释放资源(注销回调函数),未调用报错 IllegalStateException。 |
fun flowFrom(api: CallbackBasedApi): Flow<T> = callbackFlow {
val callback = object : Callback {
override fun onNextValue(value: T) {
try {
sendBlocking(value)
} catch (e: Exception) {
}
}
override fun onApiError(cause: Throwable) {
cancel(CancellationException("API Error", cause))
}
override fun onCompleted() = channel.close()
}
api.register(callback)
awaitClose { api.unregister(callback) }
}
|