前言
当前主要针对LiveData和ViewModel两个组件源码解析。这两个组件实际是Lifecycle模块下的两个小组件,关联Lifecycle组件,下面进入正题。
LiveData组件
需求
LiveData组件:创建观察者去观察activity(生命周期拥有者)的生命周期变化;然后对当前LiveData赋值,由生命周期拥有者的生命状态决定是否通知观察者(即回调观察者的方法)。
我们回顾一下Lifecycle组件:创建观察者去观察activity(生命周期拥有者)的生命周期变化。
LiveData组件中的观察者和Lifecycle组件中的观察者是同样的设计思路。
架构设计
根据以上思路,我们做一个架构设计:
- LiveData组件定义一个观察者,观察生命周期的变化;
-
在 LiveData内部需要自定义一个Lifecycle组件生命周期观察者观察生命周期拥有者生命周期变化,再去通知LiveData观察者;
-
但是我们需要注意一点:LiveData只需要感知Destroy和非Destroy两种状态即可;非Destroy状态下通知观察者;Destroy状态下切断连接关系,方便回收;
- LiveData赋值。
- 根据MVVM(或者MVP)模式,为了完成数据层和UI层解耦,数据赋值应该放在VM(ViewModel、或者MVP的P层),但是带来一个新的问题,数据赋值如果不在主线程中,那么回调更新UI必然报错,这个问题需要考虑到代码实现中。
代码实现
根据以上架构设计,我们做具体代码实现。
1. LiveData组件定义一个观察者,观察生命周期的变化
(1)定义一个观察者Observer,用于观察,onChanged方法表示通知观察者更新。
public interface Observer<T> {
/**
* Called when the data is changed.
*
* @param t The new data
*/
void onChanged(T t);
}
(2)在 LiveData内部需要自定义一个Lifecycle组件生命周期观察者观察生命周期拥有者生命周期变化,再去通知LiveData观察者;
class LifecycleBoundObserver implements LifecycleEventObserver{
@Override
public void onStateChanged(@NonNull LifecycleOwner source,
@NonNull Lifecycle.Event event) {
}
}
当前LifecycleBoundObserver类传递一个LiveData的Observer观察者对象,在LifecycleBoundObserver观察者回调onStateChanged方法时,调用当前Observer观察者的onChanged回调;
还需要定义一个ObserverWrapper对象,见名知意:包裹Observer对象.该对象的作用是扩展Observer观察者,扩展两个字段:(1)mActive用于判断当前Observer是否是活动状态;(2)mLastVersion表示当前Observer版本,对比LiveData版本,小于LiveData版本表示当前观察者没有被通知回调。
private abstract class ObserverWrapper {
final Observer<? super T> mObserver;
boolean mActive;
int mLastVersion = START_VERSION;
ObserverWrapper(Observer<? super T> observer) {
mObserver = observer;
}
}
2. LiveData赋值
赋值,我们这里做了2个方法,一个是setValue,一个是postValue。setValue方法必须在主线程中使用,postValue方法表示可以在子线程中做赋值工作。
@Override
public void postValue(T value) {
super.postValue(value);
}
@Override
public void setValue(T value) {
super.setValue(value);
}
更多细节表现在代码中,可自行查看,基于当期设计基础上,对我们从架构理解LiveData事半功倍。
代码地址和标签下面会在提供github地址。
ViewModel组件
需求
android被官方认可的是MVVM设计模式,其中M表示model数据模型,V表示view存,VM表示实际业务处理层,M和V是不会直接关联的,需要通过VM层提供M数据并且展示在V层上,换句话说,V(view)层观察VM(viewmodel)层的M(model)数据变化,如果发生了变化则展示,如果V层生命周期已结束,那么切断V和VM层的关联,并且切断VM层和M层之间的关联。
突然想到一个问题,model和bean(或者叫entity)之间有什么关系或者区别???
好像没啥区别哈!!!其实不然,model表示是数据模型,bean或entity表示实体类模型,model可以使用bean或entity代替,或者某些角度来说两者区别不大。但是bean或entity表示的是具体