Android官方架构组件之LiveData + ViewModel + Room 源码分析

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android官方架构组件之LiveData + ViewModel + Room 源码分析相关的知识,希望对你有一定的参考价值。

参考技术A 简单使用案例:
MainActivity:

MessageViewModel:

其中viewModel.getMessageObserver().observe(this, new Observer() )
中的this即SupportActivity :LifecycleOwner

SupportActivity implements LifecycleOwner

SupportActivity

SupportActivity就是通过getLifecycle()获取 mLifecycleRegistry来标记当前Activity或Fragment的各种状态,其中ReportFragment.injectIfNeededIn(this)内部源码也是与mLifecycleRegistry.markState(Lifecycle.State.CREATED) 类似,状态的信息记录在mLifecycleRegistry对象内部。Activity的其他类型的事件如onCreate,onPause等都是通过getLifecycle()获取 mLifecycleRegistry对象调用mLifecycleRegistry内部方法来改变其状态的。

Fragment的状态更加容易看到,FragmentActivity即在Activity的生命周期中获取

FragmentActivity部分源码:

通过上面的简单分析,两个重要的类即 LifecycleRegistry extends Lifecycle:

下面是Lifecycle抽象类:

回到开始的案例:
LiveData.observe(this, new Observer);

这里我们传入的Observer和 owner.getLifecycle().addObserver()即 Activity中的Lifecycle 是不同的。
我们上面已经知道Activity中的Lifecycle是与生命周期相关的,通过Lifecycle.addObserver()可以监听到 Activity的生命周期 然后在LifecycleBoundObserver作出
相应的处理,具体的实现在LifecycleRegistry.addObserver中(Lifecycle实现类),最终会根据事件变化调用 mLifecycleObserver.onStateChanged(owner, event),

LifecycleBoundObserver.onStateChanged -> activeStateChanged -> dispatchingValue -> considerNotify(initiator) -> observer.observer.onChanged((T) mData);

最终调用的是我们传入的observer。

这样看来 LiveData<T> 就没有什么特殊的了,把它看做一个普通的观察者模式的管理者即可,比如EventBus。

https://developer.android.com/reference/android/arch/lifecycle/Lifecycle

以上是关于Android官方架构组件之LiveData + ViewModel + Room 源码分析的主要内容,如果未能解决你的问题,请参考以下文章

Android架构组件之ViewModel和LiveData

Android官方架构组件介绍之LifeCycle

Android架构组件之ViewModel和LiveData

Android架构组件之ViewModel和LiveData

Android架构组件之LiveData

Android架构组件之LiveData