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架构组件之ViewModel和LiveData