Retrofit 2. Как узнать, что пришел ответ на запрос?

186
01 января 2019, 20:10

Задача следующая: делается асинхронный вызов, в результате которого получаются некоторые данные. С момента отправки запроса до момента получения ответа в основном потоке нужно сделать паузу, чтобы дождаться получения этих данных и корректно их обработать. Как это можно реализовать?
Я пробовал создавать булеву переменную, которая в начале вызова была false и только в конце становилась true, а в основном потоке делал пустой цикл, который ждал пока она не станет true. Но ничего не вышло, приложение зависало.
Код: из диалогового окна делаем запрос getAuthorization(), после того как авторизовались нужно сделать запрос getUserInfo()

public void onClick(View view) {
            ((MainActivity)getActivity()).showWaitDialog();
            String login = etUsername.getText().toString();
            String password = etPassword.getText().toString();
            Boolean rememberMe = chbRemember.isChecked();
            if (rememberMe){
                savePref(PREF_REMEMBER_ME, true);
                savePref(PREF_LOGIN, login);
                savePref(PREF_PASSWORD, password);
            }
            ((MainActivity)getActivity()).getAuthorization(login, password, rememberMe);
            ((MainActivity)getActivity()).waitForRequest();
            switch (((MainActivity)getActivity()).getStatus()){
                case "ok":
                    ((MainActivity)getActivity()).getUserInfo();
                    ((MainActivity)getActivity()).waitForRequest();
                    switch (((MainActivity)getActivity()).getStatus()){
                        case "ok":
                            ((MainActivity)getActivity()).onLogin();
                            break;
                        case "error":
                            tvAlert.setText(((MainActivity) getActivity()).getError().getMessage());
                            break;
                        case "NoResponce":
                            tvAlert.setText("Сервер не отвечает");
                            break;
                        case "Failure":
                            tvAlert.setText("Не удалось обработать запрос. Проверьте подключение к Интернет");
                            break;
                    }
                    break;
                case "error":
                    tvAlert.setText(((MainActivity) getActivity()).getError().getMessage());
                    break;
                case "NoResponce":
                    tvAlert.setText("Сервер не отвечает");
                    break;
                case "Failure":
                    tvAlert.setText("Не удалось обработать запрос. Проверьте подключение к Интернет");
                    break;
            }
            ((MainActivity)getActivity()).hideWaitDialog();
        }

Это код "ожидалки":

public void waitForRequest(){
        do{} while (!requestDone);
    }

Это пример кода запроса, второй аналогичен:

public void getAuthorization(String login, String password, Boolean rememberMe){
        requestDone=false;
        JSONLoginPassword jsonLoginPassword = new JSONLoginPassword(login, password, rememberMe);
        MainActivity.getApi().authorization(jsonLoginPassword).enqueue(new Callback<MyResponce>() {
            @Override
            public void onResponse(Call<MyResponce> call, Response<MyResponce> response) {
                if (response.isSuccessful()) {
                    status = response.body().getStatus();
                    switch (status) {
                        case "ok":        //Если статус ok, сохраняем токен
                            String token = response.body().getData().toString();
                            PrefManager.savePref(PrefManager.PREF_TOKEN, token);
                            error.setCode("NoError");
                            error.setMessage("Запрос успешен. Данные получены");
                            requestDone=true;
                            break;
                        case "error":    //Если статус error, парсим и сохраняем ошибку
                            try {
                                error = new JSONParser(response.body().getData()).getError();
                            } catch (JSONException e) {
                                e.printStackTrace();
                            }
                            requestDone=true;
                            break;
                    }
                } else {
                    status = "NoResponce";
                    error.setCode(String.valueOf(response.code()));
                    error.setMessage(String.valueOf(response.body()));
                    requestDone=true;
                }
            }
            @Override
            public void onFailure(Call<MyResponce> call, Throwable t) {
                status = "Failure";
                error.setCode(String.valueOf(t));
                error.setMessage("Не удалось выполнить запрос. Программная ошибка");
                requestDone=true;
            }
        });
    }
READ ALSO
Как проверить наличие данных в таблице SQLite?

Как проверить наличие данных в таблице SQLite?

Есть форма регистрации и входаТребуется, чтобы если пользователь регистриурует аккаунт с таким же email, ником или паролем, ему выдавало сообщение...

184
Установка Android SDK (java.exe not found) при уже установленном JDK

Установка Android SDK (java.exe not found) при уже установленном JDK

Всем привет, Перед установкой Android SDK поставила JDKПроблема возникает при установке SDK, а именно:

192
Передать несколько фото на сервер Android

Передать несколько фото на сервер Android

В приложении использую rxjava2 retrofit 2Нужно передать фотографии сделаные в приложении на сервер(6 фото) в разные папки так что сделать одним запросом...

166
Как поменять каналы местами в TIF

Как поменять каналы местами в TIF

Есть tif с 6 каналамиДля его отображения берется растр и для него совместимый растр

185