Дооснащение "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 для каждого запроса.