Android LiveData-如何在不同活动中重用相同的ViewModel?
问题内容:
示例ViewModel:
public class NameViewModel extends ViewModel {
// Create a LiveData with a String
private MutableLiveData<String> mCurrentName;
public MutableLiveData<String> getCurrentName() {
if (mCurrentName == null) {
mCurrentName = new MutableLiveData<>();
}
return mCurrentName;
}
}
主要活动:
mModel = ViewModelProviders.of(this).get(NameViewModel.class);
// Create the observer which updates the UI.
final Observer<String> nameObserver = textView::setText;
// Observe the LiveData, passing in this activity as the LifecycleOwner and the observer.
mModel.getCurrentName().observe(this, nameObserver);
我想调用mModel.getCurrentName().setValue(anotherName);
第二个活动并使MainActivity接收更改。那可能吗?
问题答案:
调用时ViewModelProviders.of(this)
,您实际上创建/保留了ViewModelStore
绑定到的this
,因此不同的Activity具有不同的特性,ViewModelStore
并且每个Activity
使用给定的工厂ViewModelStore
创建a的不同实例ViewModel
,因此您不能ViewModel
在不同的ViewModelStore
s中具有相同的a实例。
但是,您可以通过传递自定义ViewModel工厂的单个实例(充当单例工厂)来实现此目的,因此它将始终ViewModel
在不同活动之间传递您的同一实例。
例如:
public class SingletonNameViewModelFactory extends ViewModelProvider.NewInstanceFactory {
NameViewModel t;
public SingletonNameViewModelFactory() {
// t = provideNameViewModelSomeHowUsingDependencyInjection
}
@Override
public NameViewModel create(Class<NameViewModel> modelClass) {
return t;
}
}
因此,您需要制作SingletonNameViewModelFactory
单例(例如,使用Dagger)并像这样使用它:
mModel = ViewModelProviders.of(this,myFactory).get(NameViewModel.class);
注意:
ViewModel
在不同范围之间保留s是一种反模式。强烈建议保留您的数据层对象(例如,使您的DataSource或Repository单例)并在不同的作用域(活动)之间保留数据。
阅读此文章的详细信息。