Дооснащение 2 возврата из асинхронного вызова (call.enqueue ()) - PullRequest
0 голосов
/ 28 октября 2019

Мое приложение регистрирует пользователей на моем веб-сервере. Студия 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()?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...