android - 改造 "IllegalStateException: Already executed"

标签 android retrofit okhttp rx-android retrofit2

我有一个 ID 喜欢每 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);

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

java.lang.IllegalStateException: Already executed. at retrofit2.OkHttpCall.enqueue(OkHttpCall.java:52) at retrofit2.ExecutorCallAdapterFactory$ExecutorCallbackCall.enqueue(ExecutorCallAdapterFactory.java:57) at orbyt.project.MyFragment$1.run(MyFragment.java:93)

这里有什么问题?

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

最佳答案

一个调用只能使用一次。 Its documentation告诉你如何多次使用一个:

Use clone() to make multiple calls with the same parameters to the same webserver; this may be used to implement polling or to retry a failed call.

所以使用 call.clone().enqueue(..) 表示 Asynchornouscall.clone().execute() 表示同步 分别以确保您对每个请求都有一个新的、未执行的调用

关于android - 改造 "IllegalStateException: Already executed",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35093884/

相关文章:

java - 无法创建新的远程 session 。主机名 (IP_ADDRESS) 未验证

Android:没有收到额外的 Intent ID

java - 如何根据第一个已知标记分支 SAX 解析器?

Android:你如何获得内部总内存/可用内存?

android - 改造显示请求详细信息 - 正文、标题等

android - OkHttp/Android 不返回完整结果

android - 验证 Android 中的地址输入

java - Retrofit 2 - 获取错误对象 JSON(同一请求的几个 POJO)

android - 如何告诉 OkHttpClient 忽略缓存并从服务器强制刷新?

java - OkHttp 3.11 和 TLS 1.2 支持