DataBinding(二) 一、set 解析 二、綁定 Lifecycle

Android知識總結

一、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繼承於LifecycleObserverViewDataBinding的內部類,主要用於觀察生命週期變化。

    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();
            }
        }
    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章