Retrofit " IllegalStateException: уже выполнено"
У меня есть модифицированный сетевой вызов, который id хотел бы запускать каждые 5 секунд. Мой текущий код:
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.яз..IllegalStateException: уже выполнено. в retrofit2.Охттпцолл.enqueue (OkHttpCall.Ява: 52) в retrofit2.ExecutorCallAdapterFactory$ExecutorCallbackCall.enqueue (ExecutorCallAdapterFactory.Ява: 57) на орбите.проект.MyFragment$1.run (MyFragment.java: 93)
Что такое проблема здесь?
В качестве бонуса: какой лучший способ справиться с этим? Я буду обновлять карту каждое обновление. Я думал о попытке использовать Rx, но не уверен, что это подходящий вариант использования или как его реализовать.
1 ответ:
A
Call
можно использовать только один раз. его документация рассказывает вам, как использовать один несколько раз:Используйте
clone()
для выполнения нескольких вызовов с одинаковыми параметрами на один и тот же веб-сервер; это может быть использовано для реализации опроса или повторной попытки неудачного вызова.Поэтому используйте
call.clone().enqueue(..)
для асинхронного иcall.clone().execute()
Для синхронного соответственно , чтобы убедиться, что у вас есть свежий, неисполненныйCall
для каждого запроса.