在我们的应用程序中,我们遇到了一个特殊的情况-如果我们的App.specialFlag == true
,我们需要停止来自我们代码的任何请求。我们认为,在这种情况下,最好的方法是包含特殊的Interceptor
,它将停止我们的任何请求,如下所示:
if (App.specialFlag) {
// Somehow stop request
} else {
return chain.proceed(chain.request());
}
此外,我们应该注意,我们使用RxJavaCallAdapterFactory
将响应 Package 到Observable
s中。
但是我们在OkHttp拦截器中没有看到任何停止请求的方法。
我们提出了两种方法来解决我们的问题:
a)创建特殊的ApiService.class
来 Package API中的每个请求,如下所示:
public Observable<User> getUserDetails() {
if (App.specialFlag) {
return Observable.just(null);
}
return api.getUserDetails();
}
但我们认为这是丑陋和繁琐的解决方案。
B)在Interceptor中抛出一个RuntimeException
,然后在我们使用API的每个地方捕获它。
第二个解决方案也不好,因为我们需要在链中包含很多onErrorResumeNext
运算符。
也许有人知道,如何以更“聪明”的方式处理我们的情况?
先谢谢你了!
3条答案
按热度按时间flvlnr441#
accepted answer中缺少的一件事是,您需要指定协议和消息。如果您不指定,您将获得Exception。看起来像这样:
sirbozc52#
一种防止请求被执行(在它开始之前)的方法是简单地按照你的尝试去做,但是增加了Response.Builder:
编辑26/09/2019更新的答案与Bobstring提到的细节
f4t66c6m3#
1.我建议将控制逻辑脚本放在OkHttp之外,因为它只用于发出http请求。如何触发请求以及如何处理响应以更新UI,它不需要关心;
1.如果你愿意,你可以创建一个继承自okhttp3.Interceptor的类,然后覆盖函数intercept并将你的控制逻辑脚本放在里面。