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)更新到界面上
...
...
原理
- xxBinding= DataBindingUtil.setC...:apt生成的代碼里面 xml會(huì)被分離成兩部分,并且加了tag
- 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)
- xxActivityBindingImpl 的executeBindings()來(lái)處理設(shè)置數(shù)據(jù)到界面上
- BR 用來(lái)處理和界面上的綁定,這里用到了位的或運(yùn)算提升速度