okhttp3與舊版本okhttp的區(qū)別分析

1、包名改變

包名改了由之前的 com.squareup.http.改為 okhttp3.
我們需要將導(dǎo)包名直接換掉,另外如果代碼混淆的話記得修改progurad-rules.pro 文件中將對應(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;  

例如:
okhttp3.0之前:

Paste_Image.png

okhttp3.0之后:

Paste_Image.png

3、OkHttpClient創(chuàng)建方式不同

okhttp直接new OkHttpClient,而okhttp3中提供了Builder,很好的使用了創(chuàng)建者設(shè)計模式.

4、cookie的設(shè)置方式不同:

okhttp調(diào)用OkHttpClient的setCookieHandler方法,CookieHandler是Android SDK提供的標(biāo)注的cookie管理,CookieHandler的之類CookieManager實現(xiàn)了cookie的具體管理方法,構(gòu)建CookieManager需要實現(xiàn)CookieStore接口,系統(tǒng)提供了一個默認(rèn)的實現(xiàn)CookieStoreImpl,只負(fù)責(zé)把cookie存儲在內(nèi)存中。okhttp3中已經(jīng)沒有setCookieHandler方法了,而改成了cookieJar,新增了Builder,用Builder構(gòu)建okhttp,設(shè)置cookie在Builder的cookieJar方法中設(shè)置。
如下:
okhttp3 之前用CookieHandler管理cookie,如下:

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

3.0 之后新增了兩個類Cookiejar、Cookie兩個類,開放接口,需要用戶自己去實現(xiàn)cookie的配管理。用戶可以直接在CookieJar中簡單設(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>();  
            }  
    }); 

5、post消息體構(gòu)建方式不同

okhttp使用MultipartBuilder,FormEncodingBuilder構(gòu)建post消息體,最終構(gòu)建出來的都是RequestBody,而okhttp3增加了RequestBody的子類,構(gòu)造器放到了RequestBody的子類中,MultipartBody.Builder既可以添加表單數(shù)據(jù),也可以添加文件等二進制數(shù)據(jù)。
okhttp3.0之前:

Paste_Image.png

okhttp3.0之后:

Paste_Image.png

6、Call和Callback不同

okhttp的callback方法是

void onFailure(Request request, IOException e);
void onResponse(Response response) throws IOException;  

okhttp3 的Callback方法有

void onFailure(Call call, IOException e);
void onResponse(Call call, Response response) throws IOException;

okhttp3對Call做了更簡潔的封裝,okhttp3 Call是個接口,okhttp的call是個普通class,一定要注意,無論哪個版本,call都不能執(zhí)行多次,多次執(zhí)行需要重新創(chuàng)建。

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

8、對https支持的不同

okhttp默認(rèn)調(diào)用了getDefaultSSLSocketFactory方法,該方法提供了默認(rèn)的SSLSocketFactory,就算不設(shè)置SSLSocketFactory也可以支持https,setSslSocketFactory沒有做非空判斷,如果設(shè)置為空,則使用默認(rèn)的SSLSocketFactory
okhttp3設(shè)置https的方法sslSocketFactory,對SSLSocketFactory做了非空判斷,為空會拋出異常。如果不主動設(shè)置SSLSocketFactory,okhttp3也提供了默認(rèn)的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.  
    }  
}  
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容