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