ProgressManager
ProgressManager copied to clipboard
Okhttp拦截器中加了公共参数,进度回调设置无效
OkHttp添加了公共参数比如 ?token=xxxx, 导致请求url 和ProgressManager.getInstance().addResponseListener(url,xx)中的url不一样,调试发现,mResponseListeners.containsKey(key) 最后导致没通过导致始终不走进度回调,这个可以优化下防止他人踩坑
@wangyuan0217 的确存在这个坑,我在拦截器里进行了特定类型url排除来解决这个问题
恩,ths
问一下,如果url中携带参数,参数是随机的,我怎么在rxjava中监听这个url。
这里不需要框架优化啊,你在 ProgressManager.getInstance().with(new OkHttpClient.Builder()) 之后再 Add 添加了公共参数的拦截器,不就可以了。
ProgressManager 的拦截器在判断 mResponseListeners.containsKey(key) 时,你的拦截器还没添加公共参数,这不就能保证 ProgressManager.getInstance().addResponseListener(url,xx) 和 mResponseListeners.containsKey(key) 一致吗 。。。
或者你自己在 ProgressManager.getInstance().addResponseListener 时就获取到 token 加到 URL 中再传入方法,框架根本不知道你要加什么参数,而且你的参数还不一定是固定的,还可能对不同的 URL 可变,这个属于业务逻辑的东西,而且逻辑可能非常复杂,框架是做不了的,框架不可能知道你们的业务逻辑是什么,只有你们自己做。
@JessYanCoding 你好,我在用你的MVPArms,这个框架很优秀! 针对这个问题,按照你的说法,先设置 ProgressManager.getInstance().with(new OkHttpClient.Builder()) 之后再 Add 添加了公共参数的拦截器就能解决这个问题。但是我查了下MVPAarms的代码,这个步骤是反的。 `/** * 提供 {@link OkHttpClient} * * @param application {@link Application} * @param configuration {@link OkhttpConfiguration} * @param builder {@link OkHttpClient.Builder} * @param intercept {@link Interceptor} * @param interceptors {@link List<Interceptor>} * @param handler {@link GlobalHttpHandler} * @param executorService {@link ExecutorService} * @return {@link OkHttpClient} */ @Singleton @Provides static OkHttpClient provideClient(Application application, @Nullable OkhttpConfiguration configuration, OkHttpClient.Builder builder, Interceptor intercept , @Nullable List<Interceptor> interceptors, @Nullable GlobalHttpHandler handler, ExecutorService executorService) { builder .connectTimeout(TIME_OUT, TimeUnit.SECONDS) .readTimeout(TIME_OUT, TimeUnit.SECONDS) .addNetworkInterceptor(intercept);
if (handler != null)
builder.addInterceptor(new Interceptor() {
@Override
public Response intercept(Chain chain) throws IOException {
return chain.proceed(handler.onHttpRequestBefore(chain, chain.request()));
}
});
//如果外部提供了 Interceptor 的集合则遍历添加
if (interceptors != null) {
for (Interceptor interceptor : interceptors) {
builder.addInterceptor(interceptor);
}
}
//为 OkHttp 设置默认的线程池
builder.dispatcher(new Dispatcher(executorService));
if (configuration != null)
configuration.configOkhttp(application, builder);
return builder.build();
}`
上面的代码中,handler.onHttpRequestBefore(chain, chain.request());内部可以添加公共参数,是添加了公共参数的拦截器。 configuration.configOkhttp(application, builder);内部是设置 ProgressManager.getInstance().with(new OkHttpClient.Builder()) 。
先添加了公共参数拦截器,再ProgressManager.getInstance().with(new OkHttpClient.Builder()),反了。
建议你自己在 addResponseListener 之前就将获取到 token,拼接到 url 中