До того, как были выпущены компоненты архитектуры Android, я начал работать над проектом, в котором у меня были собственные модели ViewModels, которые имели тот же жизненный цикл, что и фрагмент, а состояние ViewModels сохранялось в StateObject внутри загрузчика, чтобы состояние могло пережить изменение ориентации. ViewModel взаимодействует с фрагментом через интерфейс. Это сработало нормально, потому что ViewModel и Fragment имели одинаковый жизненный цикл. Моя ViewModel содержала все виды состояний. У него было логическое значение isLoading, логическое значение isEmptyStateVisible и т. Д. И каждый раз, когда состояние изменялось, я вызывал что-то вроде view.notifyIsLoadingChanged (true / false), и в этом случае фрагмент показывал или скрывал счетчик.
Теперь я собираюсь изменить свою реализацию, чтобы использовать новые модели просмотра вместе с LiveData. Самый быстрый способ реализовать LiveData - это изменить мою реализацию интерфейса пользовательского интерфейса, который использует ViewModel. Так что я мог бы сохранить свою текущую реализацию и просто добавить эту реализацию интерфейса пользовательского интерфейса:
public class LiveDataProductReviewSheetUI extends LiveDataUI implements ProductReviewSheetUI {
public final MutableLiveData<ReviewViewModelState> ratingDescChanged = new MutableLiveData<>();
public final MutableLiveData<ReviewViewModelState> ratingChanged = new MutableLiveData<>();
public final MutableLiveData<ReviewViewModelState> reviewChanged = new MutableLiveData<>();
public final MutableLiveData<ReviewViewModelState> reviewValid = new MutableLiveData<>();
public final MutableLiveData<ReviewViewModelState> expandReview = new MutableLiveData<>();
public final MutableLiveData<ReviewViewModelState> reviewQuestion = new MutableLiveData<>();
public final MutableLiveData<ReviewViewModelState> reviewCreated = new MutableLiveData<>();
public final MutableLiveData<ReviewViewModelState> showMsg = new MutableLiveData<>();
public final MutableLiveData<ReviewViewModelState> dismiss = new MutableLiveData<>();
public void observe(LifecycleOwner owner, final ProductReviewSheetUI observer) {
ratingDescChanged.observe(owner, state -> observer.onRatingDescriptionChanged(state));
ratingChanged.observe(owner, state -> observer.onRatingChanged(state));
reviewChanged.observe(owner, state -> observer.onReviewChanged(state));
reviewValid.observe(owner, state -> observer.onHasValidReviewDataChanged(state));
expandReview.observe(owner, state -> observer.onExpandReviewFieldHasChanged(state));
reviewQuestion.observe(owner, state -> observer.onProductReviewQuestionChanged(state));
reviewCreated.observe(owner, state -> observer.onReviewCreated(state));
showMsg.observe(owner, state -> observer.onShowMessage(state));
dismiss.observe(owner, state -> observer.onCloseView());
}
@Override
public void onRatingDescriptionChanged(ReviewViewModelState state) {
ratingDescChanged.setValue(state);
}
@Override
public void onRatingChanged(ReviewViewModelState state) {
ratingChanged.setValue(state);
}
@Override
public void onReviewChanged(ReviewViewModelState state) {
reviewChanged.setValue(state);
}
@Override
public void onHasValidReviewDataChanged(ReviewViewModelState state) {
reviewValid.setValue(state);
}
@Override
public void onExpandReviewFieldHasChanged(ReviewViewModelState state) {
expandReview.setValue(state);
}
@Override
public void onProductReviewQuestionChanged(ReviewViewModelState state) {
reviewQuestion.setValue(state);
}
@Override
public void onReviewCreated(ReviewViewModelState state) {
reviewCreated.setValue(state);
}
@Override
public void onShowMessage(ReviewViewModelState state) {
showMsg.setValue(state);
}
@Override
public void onCloseView() {
dismiss.setValue(dismiss.getValue());
}
}
Класс LiveDataUI, который расширяет этот класс, имеет еще больше таких методов, как:
public final MutableLiveData<Boolean> showLoading = new MutableLiveData<>();
public final MutableLiveData<Boolean> showEmptyState = new MutableLiveData<>();
С этой реализацией у меня будет много объектов MutableLiveData, и это кажется неправильным. Я слишком много вкладываю в свою ViewModel? Моя идея заключалась в том, чтобы вся логика была внутри ViewModel, чтобы я мог писать тесты, в которых я мог бы проверить, что isLoading истинно при загрузке данных, и если нет данных, возвращаемых из Api, isEmptyState истинно и т. Д.
Я также заметил, что если я вызываю setValue (state); несколько раз за очень короткое время для одного и того же объекта MutableLiveData метод onChanged вызывается только один раз. Это верно?
sealed
классы, которые позволят вам объединить все эти объекты LiveData в один. - person Ivan   schedule 07.07.2021