32

我有一个改造网络调用,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.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只能使用一次。它的文档告诉你如何多次使用它:

用于clone()对同一个网络服务器使用相同的参数进行多次调用;这可用于实现轮询或重试失败的调用。

因此,分别使用forcall.clone().enqueue(..) Asynchornousfor call.clone().execute()Synchornous 确保您对每个请求都有一个新鲜的、未执行的。Call

于 2016-01-29T21:37:49.263 回答