Предлагаю вам взглянуть на Android Руководство разработчика по архитектуре приложений . Он основан на архитектуре MVVM и представляет репозиторий, который обрабатывает веб-вызовы. Может быть, это вам поможет.
Но чтобы ответить на ваш вопрос: следуя четкой архитектуре MVVM, Activity должен вызывать только метод в ViewModel, а не делать какие-либо логики c. Этот метод во ViewModel должен либо выполнить logi c, либо делегировать его дальше в Model или, например, в репозиторий.
Если вход в систему не может быть выполнен из-за отсутствия соединения Inte rnet, ViewModel должен обработать это, установив некоторые LiveData, возможно, LiveData<String> errorMessage
, и Activity должен наблюдать эти LiveData и показывать сообщение пользователь всякий раз, когда этот LiveData предоставляет новую строку.
Редактировать: пример кода.
Репозиторий:
public void performLogin(String username, String password, MutableLiveData<LoginStatus> loginStatus) {
if (/*check Internet access*/) {
performLoginAsync(username, password, loginStatus);
} else {
loginStatus.setValue(LoginStatus.NO_INTERNET);
}
}
private void performLoginAsync(String username, String password, MutableLiveData<LoginStatus> loginStatus) {
/*perform async login with success and error callback*/
myWebservice.login(
username,
password,
() -> loginStatus.setValue(LoginStatus.SUCCESS), /*success callback*/
error -> loginStatus.setValue(LoginStatus.ERROR) /*error callback*/
);
}
ViewModel:
public MutableLiveData<LoginStatus> loginStatus;
private Repository myRepository;
public void performLogin(String username, String password) {
myRepository.performLogin(username, password, loginStatus);
}
Фрагмент:
private ViewModel myViewModel;
private EditText loginUsername, loginPassword;
private Button loginButton;
/* in some method, where you want your initialization, e.g. in onViewCreated */
loginButton.setOnClickListener(v -> {
myViewModel.login(loginUsername.getText().toString(), loginPassword.getText().toString());
});
myViewModel.loginStatus.observe(this, loginStatus -> Toast.makeText(this, loginStatus.getText(), Toast.LENGTH_LONG));
Этот код не является рабочим примером, но он должен содержать большую его часть и указывать правильное направление. Надеюсь, поможет. Если что-то не понятно, сделайте еще один комментарий