2016-01-29 3 views
15

У меня есть сетевой дооснащенный сетевой идентификатор, который нужно запускать каждые 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, но не уверен, что это подходящий прецедент или как его реализовать.

+0

Возможно ли, что ваш сетевой вызов длится более 5 секунд, поэтому, когда вторая итерация начинается, первая итерация еще не закончена? Задержка не начинается, когда закончилась первая итерация, но через 5 секунд после того, как вы вызвали первую итерацию. – TooManyEduardos

+0

@TooManyEduardos. Я знаю, что первый вызов завершается, потому что я регистрирую ответ и фактически получаю данные. – Orbit

+0

, но в журнале отображаются только полученные данные, а не сетевое подключение. Это может быть закрытие элементов в течение 5 секунд окна. Это всего лишь идея, но попробуйте увеличить задержку до 15 секунд и посмотреть, не исчезла ли проблема. – TooManyEduardos

ответ

45

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

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

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

+0

Удивительный, спасибо. – Orbit