提供泛型参数,传入具体类的.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; } }