liveData {
this.emit("data") //1处
}.observe(owner){
data -> doSomething(data)//2处
}
开局一段代码
LiveDataScope,
可以直接在代码块中(1处)中调用其emit方法,向LiveData发值。public fun <T> liveData(
context: CoroutineContext = EmptyCoroutineContext,
timeout: Duration,
@BuilderInference block: suspend LiveDataScope<T>.() -> Unit
): LiveData<T> = CoroutineLiveData(context, timeout.toMillis(), block)
内部实现代码有删减只保留关键部分。
internal class CoroutineLiveData<T>(
context: CoroutineContext = EmptyCoroutineContext,
timeoutInMs: Long = DEFAULT_TIMEOUT,
block: Block<T>
) : MediatorLiveData<T>() {
private var blockRunner: BlockRunner<T>?
init {
val supervisorJob = SupervisorJob(context[Job])
val scope = CoroutineScope(Dispatchers.Main.immediate + context + supervisorJob)
//注释3.对象创建时会构建一个BlockRunner对象
blockRunner = BlockRunner( liveData = this,block = block,timeoutInMs = timeoutInMs, scope = scope)
{
blockRunner = null//注释4 最后一个参数是,此处会在代码块执行到末尾时执行。
}
}
override fun onActive() {
super.onActive()
blockRunner?.maybeRun() //注释5 活跃时尝试执行代码块,如果blockRunner为空就不会执行
}
}
internal class BlockRunner<T>(..) {
private var runningJob: Job? = null
@MainThread
fun maybeRun() {
if (runningJob != null) return //注释7. 如果runningJob不为空也不会执行。
runningJob = scope.launch {
block(liveDataScope)//执行代码块
onDone()
}
}
}
# BlockRunner
fun cancel() { //LiveData onInactive()时被调用
cancellationJob = scope.launch(Dispatchers.Main.immediate) {
delay(timeoutInMs) //注释10处
if (!liveData.hasActiveObservers()) {
runningJob?.cancel()
runningJob = null //注释11
}
}
}
fun maybeRun() {
cancellationJob?.cancel()//注释11
cancellationJob = null
runningJob?.cancel()
...
}
image.png
addSource(LiveData<S> source, Observer<? super S> onChanged)
当sourceLiveData数据有变化后,onChanged这个Observer会的onChange方法会被回调,我们可以在这个回调里选择向MediatorLiveData设置数据。public <S> void removeSource(LiveData<S> toRemote)
这个方法可以停止对某个LiveData的监听。private static class Source<V> implements Observer<V> {
final LiveData<V> mLiveData;
final Observer<? super V> mObserver;
int mVersion = START_VERSION;
void plug() { mLiveData.observeForever(this); }
void unplug() { mLiveData.removeObserver(this); }
@Override
public void onChanged(@Nullable V v) {
if (mVersion != mLiveData.getVersion()) {//会对比版本
mVersion = mLiveData.getVersion();
mObserver.onChanged(v);
}
}
}
这个类的位置在 lifecycle-viewmodel-savedstate的SavedStateHandle类中,也是继承自MutableLiveData,其与MutableLiveData最大的不同是多了两个属性。
private String mKey;
private SavedStateHandle mHandle;
作用是保证,LiveData所在的Viewmodel重建时,能够拿到销毁前的数据。
本文介绍了Jetpack中,LiveData比较有特点的子类。
视频: Android中高级进阶之MVVM与JetPack: LiveData 资深架构师逐题详解Android大厂精选高频面试题之LiveData
本文系转载,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文系转载,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。