Мое приложение регистрирует пользователей на моем веб-сервере. Студия Android создала много кода для LoginActivity
. поток идет следующим образом:
из LoginActivity
:
loginButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
loadingProgressBar.setVisibility(View.VISIBLE);
loginViewModel.login(usernameEditText.getText().toString(),
passwordEditText.getText().toString());
}
});
Затем в LoginViewModel
:
public void login(String username, String password) {
// can be launched in a separate asynchronous job
Result<LoggedInUser> result = loginRepository.login(username, password);
if (result instanceof Result.Success) {
LoggedInUser data = ((Result.Success<LoggedInUser>) result).getData();
loginResult.setValue(new LoginResult(new LoggedInUserView(data.getDisplayName())));
} else {
loginResult.setValue(new LoginResult(R.string.login_failed));
}
}
В LoginRepository
public Result<LoggedInUser> login(String username, String password) {
// handle login
Result<LoggedInUser> result = dataSource.login(username, password);
if (result instanceof Result.Success) {
setLoggedInUser(((Result.Success<LoggedInUser>) result).getData());
}
return result;
}
Наконец LoginDataSource
public Result<LoggedInUser> login(String username, String password) {
try {
LoggedInUser fakeUser = new LoggedInUser();
Call<String> call = serverApi.authenticate(username, password);
call.enqueue(new Callback<String>() {
@Override
public void onResponse(Call<String> call, Response<String> response) {
if (response.code() == 200) {
fakeUser.setDisplayName(username);
fakeUser.setUserId("user id");
}
System.out.println(response.code());
}
@Override
public void onFailure(Call<String> call, Throwable t) {
}
});
// TODO: handle loggedInUser authentication
if (fakeUser.getDisplayName() == null) {
throw new Exception("could not login!");
}
return new Result.Success<>(fakeUser);
} catch (Exception e) {
e.printStackTrace();
return new Result.Error(new IOException("Error logging in", e));
}
}
Я знаю, что могу поместить метод onClick()
из LoginActivity
в AsyncTask
и затем вызвать call.execute()
в LoginDataSource
. Этот вариант просто лучше / более стандартный / более удобный или лучше использовать call.enqueue()
? Как вернуть объект Result.?
из метода login()
на основе ответа, полученного от call.enqueue()
? Теперь очевидно, что код просто проходит и возвращает пустое fakeUser
.
А что означает комментарий в LoginViewModel
: // can be launched in a separate asynchronous job
? Означает ли это вызов метода LoginViewModel.login()
или вызов метода LoginRepository.login()
?