2016-01-29 12 views
15

私はRetrofitネットワークコールを5秒ごとに実行したいと思っています。私の現在のコード:Retrofit "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:すでに実行。 orbyt.project.MyFragment $ 1.runでretrofit2.ExecutorCallAdapterFactory $ ExecutorCallbackCall.enqueueでretrofit2.OkHttpCall.enqueue(OkHttpCall.java:52) (ExecutorCallAdapterFactory.java:57) で (MyFragment.java:93)

ここで問題は何ですか?

ボーナスとして、これを処理するにはどうすればよいでしょうか?悪い毎回地図を更新しています。私はRxを使ってみようと考えていましたが、これが適切なユースケースなのか、それを実装するのかは不明です。

+0

ネットワークコールに5秒以上かかる可能性があります.2回目の繰り返しが開始されると、最初の繰り返しはまだ完了していませんか?最初の反復が終了してから遅延が開始されませんが、最初の反復を呼び出した時点から5秒です。 – TooManyEduardos

+0

@TooManyEduardosよく、私は最初の呼び出しが完了していることを知っています。 – Orbit

+0

しかし、ログには受信したデータだけが表示され、ネットワーク接続は完了していません。それはまだ5秒のウィンドウ内の閉じている要素かもしれません。これは単なるアイデアですが、遅延を15秒に増やしてみて、問題がなくなるかどうかを確認してください。 – TooManyEduardos

答えて

45

Callは1回のみ使用できます。 Its documentationは1を複数回使用する方法を説明します:

使用clone()同じWebサーバに同じパラメータで複数の呼び出しを行います。ポーリングを実装したり、失敗したコールを再試行するために使用できます。

ですから、要求ごとに新鮮な、未実行Callを持っていることを確認するためにcall.clone().enqueue(..)を使用しています。

+0

素晴らしいです、ありがとうございます。 – Orbit

関連する問題