OkHttp3升级实践与2.0对比

Okhttp是一个高效的Http客户端,我们公司的app也采用Okhttp。
OKhttp在过年之前更新到了3.0了。3.0相对与之前的2.0变动比较大,不能直接升级版本后就行,现在讲讲我在将OkHttp升级到3.0过程中需要更改的地方,及okhttp3.0 与之前的2.0的对比。

1,包名改变

包名改了由之前的 com.squareup.http.** 改为 okhttp3.**
我们需要将导包名直接换掉,另外记得修改progurad-rules.pro 文件中将对应包名

2,OkHttpClient参数配置

之前参数可以直接mOkHttpClient.setCache(cache)设置,
现在OkHttpClient使用创建者模式,需要在OkHttpClient.Builder上设置可配置的参数如下:

Dispatcher dispatcher; // 分发
Proxy proxy; // 代理
List<Protocol> protocols;
List<ConnectionSpec> connectionSpecs;
final List<Interceptor> interceptors = new ArrayList<>(); // 拦截器 final List<Interceptor> networkInterceptors = new ArrayList<>(); // 网络拦截器 ProxySelector proxySelector;
CookieJar cookieJar;
Cache cache; // 缓存
InternalCache internalCache;
SocketFactory socketFactory;
SSLSocketFactory sslSocketFactory;
HostnameVerifier hostnameVerifier;
CertificatePinner certificatePinner;
Authenticator proxyAuthenticator; // 代理证书
Authenticator authenticator; // 证书
ConnectionPool connectionPool;
Dns dns; // DNS
boolean followSslRedirects;
boolean followRedirects;
boolean retryOnConnectionFailure;
int connectTimeout;
int readTimeout;
int writeTimeout;

例如:

OkHttpClient.Builder okHttpClientBuilder = client.newBuilder(); /* 超时设置 */ okHttpClientBuilder.connectTimeout(10, TimeUnit.SECONDS) .writeTimeout(30, TimeUnit.SECONDS) .readTimeout(30, TimeUnit.SECONDS);

OkHttpClient mOkHttpClient = okHttpClientBuilder.build();

3.Cookie管理

okhttp3 之前用CookieHandler管理cookie

/* cookie管理 */ 
 mCookieHandler = new CookieManager(null, CookiePolicy.ACCEPT_ALL); 
 mOkHttpClient.setCookieHandler(mCookieHandler);

3.0 之后新增了两个类Cookiejar、Cookie两个类,开放接口,需要用户自己去实现cookie的配管理。
用户可以直接在CookieJar中简单设置Cookie的管理,如下:

okHttpClientBuilder.cookieJar(new CookieJar() {
      private final HashMap<HttpUrl, List<Cookie>> cookieStore = new HashMap<>();
            @Override
              public void saveFromResponse(HttpUrl url, List<Cookie> cookies) {
                cookieStore.put(url, cookies);
               }

           @Override
             public List<Cookie> loadForRequest(HttpUrl url) {
                  List<Cookie> cookies = cookieStore.get(url);
                  return cookies != null ? cookies : new ArrayList<Cookie>();
           }
   });

当然网上有更多的比较好的Cookie持久化方案可以采用: [PersistentCookieJar](https://github.com/franmontiel/PersistentCookieJar) ;

Cookies持久化方案,根据一定的规则去缓存或者获取Cookie:

CookieJar cookieJar = new PersistentCookieJar(new SetCookieCache(), new SharedPrefsCookiePersistor(ctx));
okHttpClientBuilder.cookieJar(cookieJar);

4、 Callback

回调方法Callback在3.0之后在之前的基础上增加参数Call:
void onResponse(Call call, Response response) throws IOException;
用户可以更加随意方便控制call.

5、OkHttpClient的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();
            }
        }
    }
    原文作者:Jinwong
    原文地址: https://www.jianshu.com/p/ab41007f95c5
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞