封装一个ViewModel的基类AbstractViewModel,继承自ViewModel

    技术2022-07-10  129

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

     

    Processed: 0.009, SQL: 9