【问题标题】:Retrofit cancel() & check if request was delivered to server改造 cancel() 并检查请求是否已发送到服务器
【发布时间】:2018-08-30 07:17:40
【问题描述】:

如何确保对 Retrofit 原因请求的调用 cancel() 不会传送到服务器?

目前我知道,在 Retrofit 上调用取消将调用回调的 onFailure 分支。然后我可以检查失败的原因是否是因为呼叫被取消了。 https://futurestud.io/tutorials/retrofit-2-cancel-requests

但是我可以确定,该请求没有到达服务器吗?

【问题讨论】:

标签: android retrofit retrofit2


【解决方案1】:

来自here的代码sn-p

new Callback<ResponseBody>() {  
        @Override
        public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {
            Log.d(TAG, "request success");
        }

        @Override
        public void onFailure(Call<ResponseBody> call, Throwable t) {
            if (call.isCanceled()) {
                Log.e(TAG, "request was cancelled");
            }
            else {
                Log.e(TAG, "other larger issue, i.e. no network connection?");
            }

        }
    };

据此,如果调用被取消,这将引发,正如它所说的

// something happened, for example: user clicked cancel button call.cancel();

如果你打电话给call.cancel(),让我们稍后再说,这意味着你已经得到了服务器的响应,因此你不会到达onFailure 正在检查call.isCanceled() 的点:)

如果您取消请求,Retrofit 会将其归类为失败的请求,并因此在您的请求声明中调用 onFailure() 回调。当没有 Internet 连接或网络级别出现问题时,也会使用此回调。从应用程序的角度来看,这些错误是完全不同的。

【讨论】:

  • 但我找不到对我原来问题的答复。当您调用 call.cancel() 时,如果请求已经发送到服务器或者您足够快并且根本没有发送请求,您将如何获取信息?
  • 取决于您的请求,除非您稍后启动请求,否则大多数情况下您不会quick enough 取消它,以便用户有时间取消它。既然你收到了onResponse 的回复,这意味着他无法及时取消。
  • 好的,谢谢。 Ionut J. Bejan 似乎是真的,只要我已经开始调用,就可以将请求发送到服务器。如果我使用 Call.cancel() 我只是忽略了对响应的监听,因此无法知道我是否在发送之前取消了该请求。
  • 好吧,我认为一旦你到达onResponse 意味着你的服务器响应了,因此意味着它收到了请求:) (这意味着你打电话给call.cancel() 太晚了。我认为就这么简单
猜你喜欢
  • 2015-08-10
  • 2021-09-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-08
  • 1970-01-01
  • 2019-02-16
  • 1970-01-01
相关资源
最近更新 更多