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();
}
}
}