32

5 秒ごとに実行したい Retrofit ネットワーク呼び出しがあります。私の現在のコード:

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);

これは 1 回実行されますが、次のようにスローされます。

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 を使用しようと考えていましたが、これが適切なユースケースであるかどうか、または実装方法がわかりません。

4

1 に答える 1

78

ACallは 1 回のみ使用できます。そのドキュメントには、1 つを複数回使用する方法が記載されています。

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

したがって、Asynchornous と Synchornous をそれぞれ使用call.clone().enqueue(..)リクエストcall.clone().execute()ごと未 実行の新鮮なリクエストがあることを確認してください。 Call

于 2016-01-29T21:37:49.263 に答える