Android开发APP端网络

OkHttp升级OkHttp3的姿势全解

2019-04-15  本文已影响5人  我们都很努力着

1、包名改变

之前

compile com.squareup.okhttp:okhttp:2.5.0

之后

implementation com.squareup.okhttp3:okhttp:3.14.1

2、OkHttpClient参数配置

之前

mOkHttpClient.setCache(cache) 这样设置

之后

需要在OkHttpClient.Builder上设置可配置  

3、Timeout参数配置

之前

OkHttpClient okHttpClient = new OkHttpClient();
okHttpClient.setReadTimeout(10000, TimeUnit.MILLISECONDS);
okHttpClient.setConnectTimeout(15000, TimeUnit.MILLISECONDS);

之后

OkHttpClient okHttpClient = new OkHttpClient();
okHttpClient.newBuilder().readTimeout(10000, TimeUnit.MILLISECONDS);
okHttpClient.newBuilder().connectTimeout(15000, TimeUnit.MILLISECONDS);

4、FormEncodingBuilder参数配置

之前

Request.Builder builder = new Request.Builder();
FormEncodingBuilder formEncodingBuilder = new FormEncodingBuilder();
formEncodingBuilder.add(key, value);
RequestBody requestBody = formEncodingBuilder.build();
builder.url(this.url).post(requestBody);

之后

Request.Builder builder = new Request.Builder();
FormBody formEncodingBuilder = new FormBody.Builder().add(key, value).build();
builder.url(this.url).post(formEncodingBuilder);

5、Call参数配置

之前

OkHttpClient mOkHttpClient = new OkHttpClient();
Request.Builder builder = new Request.Builder().url();
Request request = builder.build(); 
Call call = mOkHttpClient.newCall(request);
call.enqueue(new Callback() {
            @Override
            public void onFailure(Request request, IOException e) { 
            }
            @Override
            public void onResponse(Response response) throws IOException { 
            }
        });

之后

OkHttpClient mOkHttpClient = new OkHttpClient();
Request.Builder builder = new Request.Builder().url();
Request request = builder.build(); 
Call call = mOkHttpClient.newCall(request);
 call.enqueue(new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {
            }
            @Override
            public void onResponse(Call call, Response response) throws IOException {

            }
        });

6、Cancel方法参数

3.0之前我们去掉call 可以直接使用mOkHttpClient.cancel(tag);
3.0之后直接阉割掉此方法我们可以采用如下方法:

public void cancelCallsWithTag(Object tag) {  
        checkInit();  
        if (tag == null) {  
            return;  
        }  
        synchronized (mOkHttpClient.dispatcher().getClass()) {  
            for (Call call : mOkHttpClient.dispatcher().queuedCalls()) {  
                if (tag.equals(call.request().tag())) call.cancel();  
            }  
            for (Call call : mOkHttpClient.dispatcher().runningCalls()) {  
                if (tag.equals(call.request().tag())) call.cancel();  
            }  
        }  
    }

7、对https支持的不同

okhttp默认调用了getDefaultSSLSocketFactory方法,该方法提供了默认的SSLSocketFactory,就算不设置SSLSocketFactory也可以支持https,setSslSocketFactory没有做非空判断,如果设置为空,则使用默认的SSLSocketFactory。
okhttp3设置https的方法sslSocketFactory,对SSLSocketFactory做了非空判断,为空会抛出异常。如果不主动设置SSLSocketFactory,okhttp3也提供了默认的http3支持。

if (builder.sslSocketFactory != null || !isTLS) { 
    this.sslSocketFactory = builder.sslSocketFactory; 
  } else { 
     try { 
      SSLContext sslContext = SSLContext.getInstance("TLS"); 
       sslContext.init(null, null, null); 
       this.sslSocketFactory = sslContext.getSocketFactory(); 
    } catch (GeneralSecurityException e) { 
       throw new AssertionError(); // The system has no TLS. Just give up. 
    } 
}
上一篇下一篇

猜你喜欢

热点阅读