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 19

1 ответ:

A Call можно использовать только один раз. его документация рассказывает вам, как использовать один несколько раз:

Используйте clone() для выполнения нескольких вызовов с одинаковыми параметрами на один и тот же веб-сервер; это может быть использовано для реализации опроса или повторной попытки неудачного вызова.

Поэтому используйте call.clone().enqueue(..) для асинхронного и call.clone().execute() Для синхронного соответственно , чтобы убедиться, что у вас есть свежий, неисполненный Call для каждого запроса.