Задать вопрос
@davidnum95

Почему не выполняется код в callback?

Добрый день. Никак не могу понять почему не выполняется код в методе onResponse().
public class Authentication {

    public static String accessToken;
    public static int responseCode;

    //Get access token and create db with user profile and orders
    public static void Authenticate(LoginData loginData) {

        Retrofit retrofit = new Retrofit.Builder()
                .baseUrl("http://какойтосайт.ru/api/v1/")
                .addConverterFactory(JacksonConverterFactory.create())
                .build();
        ApiService apiService = retrofit.create(ApiService.class);

        Call<String> call = apiService.getAccessToken(loginData);
        call.enqueue(new Callback<String>() {
            @Override
            public void onResponse(Call<String> call, Response<String> response) {
                //Код ниже почему то не выполняется
                responseCode = response.code();
                accessToken = response.body().substring(18, 49);
            }

            @Override
            public void onFailure(Call<String> call, Throwable t) {

            }
        });

    }
}

Вызов метода Authenicate:
public void onClick(View view) {
        loginData = new LoginData(inputPhone.getText().toString(), inputPassword.getText().toString());
        Authentication.Authenticate(loginData);
        switch (Authentication.responseCode) {...}

Код класса ApiService:
public interface ApiService {
    @Headers( "Content-Type: application/json" )
    @POST("users/login")
    Call<String> getAccessToken(@Body LoginData loginData);

}

Модель LoginData:
@JsonPropertyOrder({"phone", "password"})
public class LoginData {

    @JsonProperty("phone")
    public String Phone;

    @JsonProperty("password")
    public String Password;

    public LoginData(String phone, String password) {
        this.Phone = phone;
        this.Password = password;
    }
}
  • Вопрос задан
  • 842 просмотра
Подписаться 1 Оценить Комментировать
Решения вопроса 1
zagayevskiy
@zagayevskiy Куратор тега Java
Android developer at Yandex
Код там выполняется, просто вы этого не дождались. Суть в том, что call.enqueue выполняет запрос асинхронно, в другом потоке. А switch у вас стоит в MainThread. Когда дело доходит до switch (Authentication.responseCode), запрос ещё не выполнился. Нужно эту логику вызывать изнутри коллбека.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@belozerow
Не делайте так:
public static String accessToken;
public static int responseCode;

responseCode ещё не проинициализирован здесь
switch (Authentication.responseCode)

Проверьте, попадает ли в
@Override
            public void onFailure(Call<String> call, Throwable t) {

и если да, то по ошибке в t вы поймете сами, в чем проблема
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы