Задача следующая: делается асинхронный вызов, в результате которого получаются некоторые данные. С момента отправки запроса до момента получения ответа в основном потоке нужно сделать паузу, чтобы дождаться получения этих данных и корректно их обработать. Как это можно реализовать?
Я пробовал создавать булеву переменную, которая в начале вызова была 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;
}
});
}
Оборудование для ресторана: новинки профессиональной кухонной техники
Частный дом престарелых в Киеве: комфорт, забота и профессиональный уход
Есть форма регистрации и входаТребуется, чтобы если пользователь регистриурует аккаунт с таким же email, ником или паролем, ему выдавало сообщение...
Всем привет, Перед установкой Android SDK поставила JDKПроблема возникает при установке SDK, а именно:
В приложении использую rxjava2 retrofit 2Нужно передать фотографии сделаные в приложении на сервер(6 фото) в разные папки так что сделать одним запросом...
Есть tif с 6 каналамиДля его отображения берется растр и для него совместимый растр