ViewModel用于Activity和Fragment之间传递数据。通常用法:
MyDataModel model = new ViewModelProvider(getViewModelStore(),new MyDataModelFactory()).get(MyDataModel.class);
getViewModelStore
,由Activity提供,同一个ViewModelStore
获取同一个MyDataModel
返回的是同一个实例,因为ViewModelStore
会根据键值对存储当前ViewModel
实例。
ViewModelProvider.Factory
提供ViewModel创建实例的方法。
所以如果我们想跨Activity进行ViewModel共享数据的话,需通过ViewModelProvider.Factory
来指定ViewModel的创建方式,从而达到数据共享。
public class MyDataModel extends ViewModel {
private MutableLiveData<String> liveTextData = new MutableLiveData<>();
public MutableLiveData<String> getLiveTextData() {
return liveTextData;
}
public void setLiveTextData(String text){
liveTextData.setValue(text);
}
}
public class MyDataModelFactory implements ViewModelProvider.Factory {
private static class MyDataModalSingnalInstance{
static public MyDataModel modal = new MyDataModel();
}
@NonNull
@Override
public <T extends ViewModel> T create(@NonNull Class<T> modelClass) {
if(modelClass.equals(MyDataModel.class)){
return (T) MyDataModalSingnalInstance.modal;
}
else {
try {
return modelClass.newInstance();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
}
return null;
}
}
}
个人更偏向将需要跨Activity共享的数据通过唯一实例来共享,这样相比ViewModel更方便