У меня есть сетевой дооснащенный сетевой идентификатор, который нужно запускать каждые 5 секунд. Мой текущий код:Модернизация «IllegalStateException: уже выполнена»
Handler h = new Handler();
int delay = 5000; //milliseconds
h.postDelayed(new Runnable() {
public void run() {
call.enqueue(new Callback<ApiResponse>() {
@Override
public void onResponse(Response<ApiResponse> response) {
Log.d("api", "response: " + response.body().getPosition().getLatitude().toString());
}
@Override
public void onFailure(Throwable t) {
}
});
h.postDelayed(this, delay);
}
}, delay);
Это выполняется один раз, а затем выдает следующее:
java.lang.IllegalStateException: Уже выполнена. в retrofit2.OkHttpCall.enqueue (OkHttpCall.java:52) в retrofit2.ExecutorCallAdapterFactory $ ExecutorCallbackCall.enqueue (ExecutorCallAdapterFactory.java:57) в orbyt.project.MyFragment $ 1.Run (MyFragment.java:93)
В чем проблема?
В качестве бонуса: какой лучший способ справиться с этим? Я буду обновлять карту при каждом обновлении. Я думал о попытке использовать Rx, но не уверен, что это подходящий прецедент или как его реализовать.
Возможно ли, что ваш сетевой вызов длится более 5 секунд, поэтому, когда вторая итерация начинается, первая итерация еще не закончена? Задержка не начинается, когда закончилась первая итерация, но через 5 секунд после того, как вы вызвали первую итерацию. – TooManyEduardos
@TooManyEduardos. Я знаю, что первый вызов завершается, потому что я регистрирую ответ и фактически получаю данные. – Orbit
, но в журнале отображаются только полученные данные, а не сетевое подключение. Это может быть закрытие элементов в течение 5 секунд окна. Это всего лишь идея, но попробуйте увеличить задержку до 15 секунд и посмотреть, не исчезла ли проблема. – TooManyEduardos