目录
Observable
BaseObservable
private transient PropertyChangeRegistry mCallbacks;
PropertyChangeRegistry
callback.onPropertyChanged(sender, arg);
WeakPropertyListener
public void onPropertyChanged(Observable sender, int propertyId) {
ViewDataBinding binder = this.mListener.getBinder();
if (binder != null) {
Observable obj = (Observable)this.mListener.getTarget();
if (obj == sender) {
binder.handleFieldChange(this.mListener.mLocalFieldId, sender, propertyId);
}
}
}
handleFieldChange
private void handleFieldChange(int mLocalFieldId, Object object, int fieldId) {
if (!this.mInLiveDataRegisterObserver) {
boolean result = this.onFieldChange(mLocalFieldId, object, fieldId);
if (result) {
this.requestRebind();
}
}
}
requestRebind
if (USE_CHOREOGRAPHER) {
this.mChoreographer.postFrameCallback(this.mFrameCallback);
} else {
this.mUIThreadHandler.post(this.mRebindRunnable);
}
mRebindRunnable
ViewDataBinding.this.executePendingBindings();
executeBindings(仅更新mDirtyFlags标识)
LiveData
LiveData.setValue()
dispatchingValue(null);
dispatchingValue
considerNotify(initiator);
considerNotify
observer.mObserver.onChanged((T) mData);
onChanged
@Override
public void onChanged(@Nullable Object o) {
ViewDataBinding binder = mListener.getBinder();
if (binder != null) {
binder.handleFieldChange(mListener.mLocalFieldId, mListener.getTarget(), 0);
}
}
handleFieldChange
onFieldChange();//设置mDirtyFlags
requestRebind();
requestRebind->mRebindRunnable->executeBindings
绑定
UI->Data
setOnCheckedChangeListener(androidx.databinding.InverseBindingListener)
回调中设置 observable对象的值,此时不更新UI也不执行executeBindings;
Data->UI(executeBindings中执行)
最后依据observable的最新变化,设置view的属性
setChecked(view, value);