私は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を使ってみようと考えていましたが、これが適切なユースケースなのか、それを実装するのかは不明です。
ネットワークコールに5秒以上かかる可能性があります.2回目の繰り返しが開始されると、最初の繰り返しはまだ完了していませんか?最初の反復が終了してから遅延が開始されませんが、最初の反復を呼び出した時点から5秒です。 – TooManyEduardos
@TooManyEduardosよく、私は最初の呼び出しが完了していることを知っています。 – Orbit
しかし、ログには受信したデータだけが表示され、ネットワーク接続は完了していません。それはまだ5秒のウィンドウ内の閉じている要素かもしれません。これは単なるアイデアですが、遅延を15秒に増やしてみて、問題がなくなるかどうかを確認してください。 – TooManyEduardos