ProgressManager icon indicating copy to clipboard operation
ProgressManager copied to clipboard

Okhttp拦截器中加了公共参数,进度回调设置无效

Open wangyuan0217 opened this issue 5 years ago • 7 comments

OkHttp添加了公共参数比如 ?token=xxxx, 导致请求url 和ProgressManager.getInstance().addResponseListener(url,xx)中的url不一样,调试发现,mResponseListeners.containsKey(key) 最后导致没通过导致始终不走进度回调,这个可以优化下防止他人踩坑

wangyuan0217 avatar May 16 '19 08:05 wangyuan0217

@wangyuan0217 的确存在这个坑,我在拦截器里进行了特定类型url排除来解决这个问题

Leu-Z avatar May 22 '19 10:05 Leu-Z

恩,ths

wangyuan0217 avatar May 23 '19 11:05 wangyuan0217

问一下,如果url中携带参数,参数是随机的,我怎么在rxjava中监听这个url。

z2700589 avatar Jun 30 '19 12:06 z2700589

这里不需要框架优化啊,你在 ProgressManager.getInstance().with(new OkHttpClient.Builder()) 之后再 Add 添加了公共参数的拦截器,不就可以了。

ProgressManager 的拦截器在判断 mResponseListeners.containsKey(key) 时,你的拦截器还没添加公共参数,这不就能保证 ProgressManager.getInstance().addResponseListener(url,xx) 和 mResponseListeners.containsKey(key) 一致吗 。。。

JessYanCoding avatar Sep 26 '19 08:09 JessYanCoding

或者你自己在 ProgressManager.getInstance().addResponseListener 时就获取到 token 加到 URL 中再传入方法,框架根本不知道你要加什么参数,而且你的参数还不一定是固定的,还可能对不同的 URL 可变,这个属于业务逻辑的东西,而且逻辑可能非常复杂,框架是做不了的,框架不可能知道你们的业务逻辑是什么,只有你们自己做。

JessYanCoding avatar Sep 26 '19 09:09 JessYanCoding

@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()),反了。

Leu-Z avatar Sep 30 '19 06:09 Leu-Z

建议你自己在 addResponseListener 之前就将获取到 token,拼接到 url 中

JessYanCoding avatar Oct 10 '19 06:10 JessYanCoding