У меня есть UserViewModel, который отвечает за выборку информации о пользователе, а затем я отображаю ее в пользовательском интерфейсе.
UserViewModel.java
public class UserViewModel extends ViewModel {
private MutableLiveData<UserResponse> userInfoMutableLiveData;
public MutableLiveData<UserResponse> getUserInfoMutableLiveData() {
if (userInfoMutableLiveData == null) {
userInfoMutableLiveData = new MutableLiveData<>();
fetchUserInfo();
}
return userInfoMutableLiveData;
}
private void fetchUserInfo() {
// Asynchronous call using RxJava to fetch user information.
}
Я звонюэто в пользовательском интерфейсе следующим образом.
ProfileFragment.java
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_profile, container, false);
viewModel = ViewModelProviders.of(this, viewModelFactory).get(UserViewModel.class);
viewModel.getUserInfoMutableLiveData().observe(this, this::consumeResponse);
return view;
}
Это правильно отображает данные и работает нормально.
ПРОБЛЕМА
Когда нет подключения к Интернету, мое приложение отображает экран с предупреждением об отсутствии подключения к Интернету, а затем кнопку для повторного вызова.
ProfileFragment.java
@Override
public void onRetryClick() {
viewModel.getUserInfoMutableLiveData().observe(this, this::consumeResponse);
}
Предположим, что в следующем сценарии я выполняю вызов без подключения к Интернету -> отображается кнопка повтора -> Я подключаюсь кИнтернет, а затем -> нажмите кнопку повтора.
Он будет выдавать ошибку отсутствия подключения к Интернету, потому что он просто восстанавливает предыдущее userInfoMutableLiveData
и не загружает новое.
ЧТО Я ПОПРОБОВАЛ
Я пытался получить информацию о пользователе в пользовательском интерфейсе, как это.
ProfileFragment.java
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_profile, container, false);
viewModel = ViewModelProviders.of(this, viewModelFactory).get(UserViewModel.class);
viewModel.getUserInfoMutableLiveData().observe(this, this::consumeResponse);
viewModel.fetchUserInfo();
return view;
}
, а затем вызовите onRetryClick()
следующим образом.
ProfileFragment.java
@Override
public void onRetryClick() {
viewModel.fetchUserInfo();
}
Это решает эту проблему, потому что он будет звонить каждый раз, когда я нажимаю кнопку повтора, однако он потерял цель ViewModel - загрузить данные один раз, а затем извлечь их.
Что мне нужно?
В заключение мне нужно правильно повторить попытку вызова ViewModel в случае отсутствия подключения к Интернету.