一、set 解析
public void setUser(@Nullable com.example.databindingdemo_20210117.User User) {
// 更新註冊
updateRegistration(0, User);
this.mUser = User;
synchronized(this) {
mDirtyFlags |= 0x1L;
}
notifyPropertyChanged(BR.user);
super.requestRebind();
}
ViewDataBinding#updateRegistration()
// 使用BR的屬性的值做index,存儲每個BR的屬性對應的監聽器
private WeakListener[] mLocalFieldObservers;
// 創建屬性的監聽器
private static final CreateWeakListener CREATE_PROPERTY_LISTENER = new CreateWeakListener() {
@Override
public WeakListener create(ViewDataBinding viewDataBinding, int localFieldId)
{
// 返回一個屬性監聽
return new WeakPropertyListener(viewDataBinding,localFieldId).getListener();
}
};
protected boolean updateRegistration(int localFieldId, Observable observable) {
return updateRegistration(localFieldId, observable, CREATE_PROPERTY_LISTENER);
}
這裏的localFieldId=0,這個id其實就BR文件中的id,就是BR文件中對應的靜態final屬性的值。而第二個就是觀察者對象,比如傳入的ViewModel對象。
private boolean updateRegistration(int localFieldId, Object observable,
CreateWeakListener listenerCreator) {
if (observable == null) {
return unregisterFrom(localFieldId);
}
// 根據BR的每個屬性的屬性值做index,存儲每個BR屬性對應的監聽器
WeakListener listener = mLocalFieldObservers[localFieldId];
if (listener == null) {
registerTo(localFieldId, observable, listenerCreator);
return true;
}
if (listener.getTarget() == observable) {
return false;//nothing to do, same object
}
unregisterFrom(localFieldId);
registerTo(localFieldId, observable, listenerCreator);
return true;
}
ViewDataBinding#registerTo
// 這個registerTo方法,其實就是將Activity這個觀察者和User這個被觀察者
// 統一添加到ObservableReference中
protected void registerTo(int localFieldId, Object observable,
CreateWeakListener listenerCreator) {
if (observable == null) {
return;
}
WeakListener listener = mLocalFieldObservers[localFieldId];
if (listener == null) {
// 通過屬性監聽器的創建器創建一個BR屬性值對應的監聽器
// listener就是WeakPropertyListener對象的getListener返回的
// 就是WeakListener對象
// 在創建WeakPropertyListener的時候,其構造器內部就會創建
// WeakListener對象,並且將WeakPropertyListener對象傳給WeakListener
// 這樣WeakListener和WeakPropertyListener就相互持有
listener = listenerCreator.create(this, localFieldId);
mLocalFieldObservers[localFieldId] = listener;
// 將監聽器與觀察者做綁定,這裏的觀察者其實就是Activity
if (mLifecycleOwner != null) {
listener.setLifecycleOwner(mLifecycleOwner);
}
}
// 將該監聽器與被觀察者做綁定
// 比如這裏的被觀察者就是User
listener.setTarget(observable);
}
這裏通過WeakListener監聽器中的ObservableReference對象保存觀察者與被觀察者,當被觀察者發生改變的時候,就會找到對應的WeakListener監聽器,然後通知觀察者做修改。而ObservableReference方法的實現,有多個,比如:WeakPropertyListener。這裏讓WeakListener.setTarget()其實就是通過WeakPropertyListener給被觀察者添加callback,然後當被觀察者數據發生改變的時候,被觀察者通過遍歷其內部的PropertyChangeRegistry中的OnPropertyChangedCallback回調(其實就是WeakPropertyListener),然後通過WeakPropertyListener監聽通知給ViewDataBinding以及其實現類ActivityMainBindingImpl具體進行數據的處理和設置。
二、綁定 Lifecycle
ViewDataBinding#setLifecycleOwner
public void setLifecycleOwner(@Nullable LifecycleOwner lifecycleOwner) {
if (mLifecycleOwner == lifecycleOwner) {
return;
}
//當存在觀察者移出,然後會添加新的觀察者
if (mLifecycleOwner != null) {
mLifecycleOwner.getLifecycle().removeObserver(mOnStartListener);
}
mLifecycleOwner = lifecycleOwner;
if (lifecycleOwner != null) {
if (mOnStartListener == null) {
//創建觀察者
mOnStartListener = new OnStartListener(this);
}
lifecycleOwner.getLifecycle().addObserver(mOnStartListener);
}
for (WeakListener<?> weakListener : mLocalFieldObservers) {
if (weakListener != null) {
weakListener.setLifecycleOwner(lifecycleOwner);
}
}
}
OnStartListener
繼承於LifecycleObserver
是ViewDataBinding
的內部類,主要用於觀察生命週期變化。
static class OnStartListener implements LifecycleObserver {
//弱引用 ViewDataBinding
final WeakReference<ViewDataBinding> mBinding;
private OnStartListener(ViewDataBinding binding) {
mBinding = new WeakReference<>(binding);
}
//start 狀態
@OnLifecycleEvent(Lifecycle.Event.ON_START)
public void onStart() {
ViewDataBinding dataBinding = mBinding.get();
if (dataBinding != null) {
dataBinding.executePendingBindings();
}
}
}