改造"IllegalStateException:已经执行"

Orb*_*bit 23 android retrofit okhttp rx-android retrofit2

我有一个Retrofit网络调用,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);
Run Code Online (Sandbox Code Playgroud)

这运行一次,但随后抛出以下内容:

java.lang.IllegalStateException:已经执行.at retrofit2.OkHttpCall.enqueue(OkHttpCall.java:52)at retrofit2.ExecutorCallAdapterFactory $ ExecutorCallbackCall.enqueue(ExecutorCallAdapterFactory.java:57)at orbyt.project.MyFragment $ 1.run(MyFragment.java:93)

这是什么问题?

作为奖励:什么是更好的方法来处理这个?我会在每次更新时更新地图.我正在考虑尝试使用Rx,但不确定这是否是一个合适的用例,或者如何实现它.

Jak*_*ton 64

A Call只能使用一次.它的文档告诉你如何多次使用它:

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

因此,使用call.clone().enqueue(..)Asynchornouscall.clone().execute()用于Synchornous 分别 以确保你有一个新鲜的,未执行的Call每个请求.