동적 시간 초과 처리 추가

  • 장면 은 8195 ° 8195 ° 특정한 인터페이스 에 시간 이 오래 걸 리 기 때문에 okHttpClient 에 동태 적 인 시간 초과 시간 을 추가 하여 업무 장면
  • 을 만족 시 켜 야 한다.
  • 처리 방식 은 8195 ° 8195 ° OkHttp 동적 추가 시간 초과 실현
  • 실현 원리
  • 도구 류 주소 다운로드 링크http://download.csdn.net/download/gl_mine_csdn/10140891
  • 처리 과정
  • 
    public class DynamicConnectTimeout implements Interceptor {
    
        private static final int CONNECT_LONG_TIMEOUT = 20;
        private static final int CONNECT_SHORT_TIMEOUT = 10;
    
        @Override
        public Response intercept(Chain chain) throws IOException {
            Request oldRequest = chain.request();
            setDynamicConnectTimeout(oldRequest,mRetrofit,"add you need dynamic interface");
            Request newRequest = oldRequest.newBuilder()
                    .method(oldRequest.method(), oldRequest.body())
                    .url(oldRequest.url())
                    .build();
            return chain.proceed(newRequest);
        }
    
        /**
         *       、            
         * @param oldRequest
         * @param retrofit
         */
        private void setDynamicConnectTimeout(Request oldRequest, Retrofit retrofit,String url) {
            //        
            final String questUrl = oldRequest.url().url().toString();
            try {
                //1、private final okhttp3.Call.Factory callFactory;   Retrofit          
                Field callFactoryField = retrofit.getClass().getDeclaredField("callFactory");
                callFactoryField.setAccessible(true);
                //2、callFactory = new OkHttpClient();   Retrofit     build() 
                OkHttpClient client = (OkHttpClient) callFactoryField.get(retrofit);
                //3、OkHttpClient(Builder builder)     OkHttpClient          
                Field connectTimeoutField = client.getClass().getDeclaredField("connectTimeout");
                connectTimeoutField.setAccessible(true);
                //4、                  
                if (questUrl.contains(url)) {
                    connectTimeoutField.setInt(client,CONNECT_LONG_TIMEOUT * 1000);
                } else {
                    connectTimeoutField.setInt(client,CONNECT_SHORT_TIMEOUT * 1000);
                }
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            } catch (NoSuchFieldException e) {
                e.printStackTrace();
            }
        }
    }
  • OkHttpClient 네트워크 감청 추가
  •  builder.addInterceptor(new DynamicConnectTimeout());

    좋은 웹페이지 즐겨찾기