提供泛型参数,传入具体类的.class即可拿到MutableLiveData实例。
注:以类的.class为key,所以获取到的MutableLiveData具有唯一性(其他AbstractViewModel子类不在此列)。
例如:
// ViewModel子类
public class MyViewModel extends AbstractViewModel {
public void query() {
getMutableLiveData(String.class).postValue("dfafafdafafdafda");
}
}
// 加入观察者
MyViewModel viewModel = ViewModelProviders.of(activity).get(MyViewModel.class);
MutableLiveData<String> liveData = viewModel.getMutableLiveData(String.class);
liveData.observe(owner, new Observer<String>() {
public void onChange(String str) {
Log.d(str);
}
});
此方式是所有MyViewModel中注册到String.class的观察者都能收到通知。
避免此问题的解决方案例子:
// 加入将String内容封闭到一个类中。
static class StringBean {
private String value;
StringBean(String value) {
this.value = value;
}
public String getValue() {return value);}
}
// ViewModel子类
public class MyViewModel extends AbstractViewModel {
public void query() {
getMutableLiveData(StringBean.class).postValue(new StringBean("string bean object"));
}
}
// 加入观察者
MyViewModel viewModel = ViewModelProviders.of(activity).get(MyViewModel.class);
MutableLiveData<StringBean> liveData = viewModel.getMutableLiveData(StringBean.class);
liveData.observe(owner, new Observer<StringBean>() {
public void onChange(StringBean bean) {
Log.d(bean.getValue());
}
});
封装ViewModel的基类源代码:
/**
* 定义了包含不同类型的MutableLiveData实例,效果如MutableLiveData<T>和MutableLiveData<List<T>>
*/
public class AbstractViewModel extends ViewModel {
/*
分两个map是为了MutableLiveData<T>和MutableLiveData<List<T>>不会互相覆盖,因为Key值都是T类型的.class
*/
/**
* 此map直接存储实例MutableLiveData(泛型T)
*/
private Map<Class<?>, MutableLiveData<?>> map = new HashMap<>();
/**
* 此map直接存储实例MutableLiveData(List包含泛型T)
*/
private Map<Class<?>, MutableLiveData<?>> map2 = new HashMap<>();
/**
* 创建一个类型是T的MutableLiveData实例
* @param t T类的.class
* @param <T> T类型
* @return MutableLiveData实例
*/
@SuppressWarnings("unchecked")
public <T> MutableLiveData<T> getMutableLiveData(Class<T> t) {
MutableLiveData<?> liveData = map.get(t);
if (liveData == null) {
liveData = new MutableLiveData<T>();
map.put(t, liveData);
}
return (MutableLiveData<T>) liveData;
}
/**
* 创建一个类型是List的MutableLiveData实例
* @param t T类的.class
* @param <T> T类型
* @return MutableLiveData实例
*/
@SuppressWarnings("unchecked")
public <T> MutableLiveData<List<T>> getMutableLiveDataList(Class<T> t) {
MutableLiveData<?> liveData = map2.get(t);
if (liveData == null) {
liveData = new MutableLiveData<List<T>>();
map2.put(t, liveData);
}
return (MutableLiveData<List<T>>) liveData;
}
}