- shankes
博客访问链接:
CSDN :shankes的博客
简书 : shankes
github:sankes.github.io
1.案例现象
public MediatorLiveData<String> result;
public MediatorLiveData<String> getMediatorLiveData() {
if (result == null) {
result = new MediatorLiveData<>();
}
return result;
}
public getData() {
LiveData<String> trigger = repository.getAll();
result.addSource(trigger, new Observer<String>() {
@Override
public void onChanged(@Nullable String data) {
result.setValue(data);
}
});
}
此处一开始尝试多次,始终不触发onChanged方法,包括使用map或switchMap时,同样无法触发
2.原理分析
原因在于LiveData数据result是有生命周期的,必须和activity或fragment生命周期绑定
3.解决方案
绑定方法有两种
方案一
在activity或fragment中调用observe方法,传入this参数,即相当于将LiveData变量result和activity或fragment的生命周期绑定完成,当然直接调用observeForever方法,也会触发onChanged方法,原因看方法名就知道了:
mViewModel.getMediatorLiveData().observe(this, new Observer<String>() {
@Override
public void onChanged(@Nullable String data) {
Log.e("onChanged:", data);
}
});
方案二
使用databinding时
先获取ViewDataBinding binding,在activity或fragment中调用方法setLifecycleOwner(this);
页面布局中将控件绑定result,这样也相当于和生命周期绑定完成
binding.setLifecycleOwner(this);
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@{result}" />
感谢
如果您觉得对您有所启发或帮助(并且个人有余力,感谢打赏)
微信
支付宝(左侧领红包,右侧打赏)