android開(kāi)源框架28LiveDataBus|DataBinding

LiveDataBus

解決粘連問(wèn)題;反射找到mLastVersion,賦值為 mVersion; mLastVersion hook起點(diǎn)在mObservers

public static class xxMutableLiveData<T> extends MutableLiveData<T>{
    @override
    public void observer(@NonNull LifecycleOwner owner,@NonNull Observer<? super T>  observer){
      super.observer(owner, observer);
      hook(observer);
  }
}

private void hook(Observer<? super T> observer){
        try{
            Class<LiveData> liveDataClass = LiveData.class;
            Field mObserversField = liveDataClass.getDeclaredField("mObservers");
            mObserversField.setAccessible(true);
            Object observersObject = mObserversField.get(this);
            Class<?> observersClass = observersObject.getClass();
            Method get = observersClass.getDeclaredMethod("get",Object.class);
            get.setAccessible(true);
            Object invokeEntry = get.invoke(observersObject, observer);
            Object observerWrapper = null;
            if(invokeEntry!=null&&invokeEntry instanceof Map.Entry){
                observerWrapper = ((Map.Entry)invokeEntry).getValue();
            }
            Class<?> superClass = observerWrapper.getClass().getSuperclass();
            Field mLastVersion = superClass.getDeclaredField("mLastVersion");
            mLastVersion.setAccessible(true);
            Field mVersion = liveDataClass.getDeclaredField("mVersion");
            mVersion.setAccessible(true);
            Object mVersionEntry = mVersion.get(this);
            mLastVersion.set(observerWrapper,mVersionEntry);
        }catch(Exception e){
            
        }
    }

DataBinding

使用

public class xxVM extends  BaseObservable{
  private String xx1;
  private String xx2;

  @Bindable
  public String getXx1(){
    return xx1;
  }

  public void setXx1(String xx1){
    this.xx1 = xx1;
    notifyPropertyChanged(BR.xx1);
  }

  @Bindable
  public String getXx2(){
    return xx2;
  }

  public void setXx2(String xx2){
    this.xx2 = xx2;
    notifyPropertyChanged(BR.xx2);
  }

}

<layout>
  <data>
      <variable
        name = "xxVM"
        type = "com.xx.xx.xxVM"
      />
  </data>
</layout>

android:text = "{xxVM.xx1}"

...XxActivity extends AppCompatActivity...
XxActivityBinding xxBinding;
XxVM xxVM;
  ...onCreate...{
    xxBinding= DataBindingUtil.setContentView(this,R.layout.xx);
    xxBinding.setXxVM(xxVM);
  }

  //賦值
  ...
  xxVM.setXx1("xyz");//可以自動(dòng)更新到界面上
  ...
...

原理

  1. xxBinding= DataBindingUtil.setC...:apt生成的代碼里面 xml會(huì)被分離成兩部分,并且加了tag
  2. xxBinding.setXxVM(xxVM):從apt代碼中找,跳轉(zhuǎn)到ViewDataBinding中 mLocalFieldObservers 存儲(chǔ)了xml中的各個(gè)節(jié)點(diǎn)的數(shù)據(jù),比如有3個(gè)節(jié)點(diǎn)就會(huì)處理3個(gè)監(jiān)聽(tīng)
  3. xxActivityBindingImpl 的executeBindings()來(lái)處理設(shè)置數(shù)據(jù)到界面上
  4. BR 用來(lái)處理和界面上的綁定,這里用到了位的或運(yùn)算提升速度
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容