答案和往常一样,取决于具体情况。
如果你提问的原因是房间访问,那么建议有一个
DataRepository
类来处理所有数据库访问,并将该存储库单例传递给每个
AndroidViewModel
。
mRepository = ((MainApp) application).getRepository()
在MainApp中:
public DataRepository getRepository() {
return DataRepository.getInstance(getDatabase(), mAppExecutors);
}
还有代码仓库:
public class DataRepository {
private static DataRepository sInstance;
private MediatorLiveData<String> mObservableString;
private DataRepository(final AppDatabase database, final AppExecutors executors) {
mObservableString.addSource(database.myDao().loadString(),
mString -> {
if (database.getDatabaseCreated().getValue() != null) {
mObservableString.postValue(mString);
}
});
}
public static DataRepository getInstance(final AppDatabase database, final AppExecutors executors) {
if (sInstance == null) {
synchronized (DataRepository.class) {
if (sInstance == null) {
sInstance = new DataRepository(database, executors);
}
}
}
return sInstance;
}
public LiveData<String> getString() {
return mObservableString;
}
在存储库中,如果您想要更改引用(源),建议使用MediatorLivedata。否则,普通的LiveData就可以胜任。
关于ViewModels:
理论上,每个片段都有自己的ViewModel。如果您使用requireActivity()
作为引用来获取它,您可以随时获取每个ViewModel并因此共享它。
例如:
viewModelA = new ViewModelProvider(requireActivity()).get(ViewModelA.class);
viewModelB = new ViewModelProvider(requireActivity()).get(ViewModelB.class);
你可以在每个Fragment中调用此方法并获取相同的ViewModel实例。如果DataRepository的设置对你来说过于繁琐,可以创建一个带有Room访问权限的ViewModel,并从每个Fragment中加载它。