在我们的应用中,我们遇到了一个特例 - 如果我们的App.specialFlag == true
,我们需要停止来自我们代码的任何请求。我们认为,在这种情况下,最好的方法是包括特殊的Interceptor
,这将阻止我们的任何请求,如下所示:
if (App.specialFlag) {
// Somehow stop request
} else {
return chain.proceed(chain.request());
}
另外,我们应该注意,我们使用RxJavaCallAdapterFactory
将回复包装到Observable
中。
但我们没有看到任何在OkHttp拦截器中停止请求的方法。
我们提出了两种解决问题的方法:
a)创建特殊的ApiService.class
,用于包装API中的每个请求,如下所示:
public Observable<User> getUserDetails() {
if (App.specialFlag) {
return Observable.just(null);
}
return api.getUserDetails();
}
但我们认为这是一个丑陋而繁琐的解决方案。
b)在Interceptor中抛出RuntimeException
,然后在我们使用API的每个地方捕获它。
第二种解决方案也不好,因为我们需要在链中包含大量onErrorResumeNext
运算符。
可能有人知道,如何以更“聪明”的方式处理我们的情况?...
提前致谢!
答案 0 :(得分:16)
阻止请求被执行的一种方法(在启动之前)它只是按照您的尝试进行,但添加了Response.Builder:
if (App.specialFlag) {
return new Response.Builder()
.code(600) //Simply put whatever value you want to designate to aborted request.
.request(chain.request())
.build();
} else {
return chain.proceed(chain.request());
}
答案 1 :(得分:15)
accepted answer中遗漏的一件事是您需要指定协议和消息。如果您未指定将获得异常。看起来像这样:
go build ./folder/
mv ./src/ ./bin/
答案 2 :(得分:0)
我建议将控制逻辑脚本放在OkHttp之外,因为它仅用于发出http请求。如何触发请求以及如何处理更新UI的响应,它不需要关心;
如果您愿意,可以创建一个继承自okhttp3.Interceptor的类,然后覆盖函数拦截并将控制逻辑脚本放入其中。
OkHttpClient client = new OkHttpClient.Builder()
.connectTimeout(20, TimeUnit.SECONDS)
.readTimeout(20, TimeUnit.SECONDS)
.addInterceptor(new Interceptor())
.build();