Okhttp是一個(gè)高效的Http客戶端试读,我們公司的app也采用Okhttp壁却。
OKhttp在過年之前更新到了3.0了披坏。3.0相對(duì)與之前的2.0變動(dòng)比較大撼唾,不能直接升級(jí)版本后就行,現(xiàn)在講講我在將OkHttp升級(jí)到3.0過程中需要更改的地方音婶,及okhttp3.0 與之前的2.0的對(duì)比慨畸。
1,包名改變
包名改了由之前的 com.squareup.http.** 改為 okhttp3.**
我們需要將導(dǎo)包名直接換掉衣式,另外記得修改progurad-rules.pro 文件中將對(duì)應(yīng)包名
2寸士,OkHttpClient參數(shù)配置
之前參數(shù)可以直接mOkHttpClient.setCache(cache)設(shè)置,
現(xiàn)在OkHttpClient使用創(chuàng)建者模式碴卧,需要在OkHttpClient.Builder上設(shè)置可配置的參數(shù)如下:
Dispatcher dispatcher; // 分發(fā)
Proxy proxy; // 代理
List<Protocol> protocols;
List<ConnectionSpec> connectionSpecs;
final List<Interceptor> interceptors = new ArrayList<>(); // 攔截器 final List<Interceptor> networkInterceptors = new ArrayList<>(); // 網(wǎng)絡(luò)攔截器 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(); /* 超時(shí)設(shè)置 */ 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 之后新增了兩個(gè)類Cookiejar弱卡、Cookie兩個(gè)類,開放接口螟深,需要用戶自己去實(shí)現(xiàn)cookie的配管理谐宙。
用戶可以直接在CookieJar中簡(jiǎn)單設(shè)置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>();
}
});
當(dāng)然網(wǎng)上有更多的比較好的Cookie持久化方案可以采用: [PersistentCookieJar](https://github.com/franmontiel/PersistentCookieJar) ;
Cookies持久化方案界弧,根據(jù)一定的規(guī)則去緩存或者獲取Cookie:
CookieJar cookieJar = new PersistentCookieJar(new SetCookieCache(), new SharedPrefsCookiePersistor(ctx));
okHttpClientBuilder.cookieJar(cookieJar);
4、 Callback
回調(diào)方法Callback在3.0之后在之前的基礎(chǔ)上增加參數(shù)Call:
void onResponse(Call call, Response response) throws IOException;
用戶可以更加隨意方便控制call.
5搭综、OkHttpClient的Cancel方法去掉
3.0之前我們?nèi)サ鬰all 可以直接使用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();
}
}
}