欧美一级特黄大片做受成人-亚洲成人一区二区电影-激情熟女一区二区三区-日韩专区欧美专区国产专区

OkHttp怎么用

這篇文章主要為大家展示了“OkHttp怎么用”,內(nèi)容簡而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領(lǐng)大家一起研究并學(xué)習(xí)一下“OkHttp怎么用”這篇文章吧。

創(chuàng)新互聯(lián)自成立以來,一直致力于為企業(yè)提供從網(wǎng)站策劃、網(wǎng)站設(shè)計(jì)、做網(wǎng)站、成都網(wǎng)站設(shè)計(jì)、電子商務(wù)、網(wǎng)站推廣、網(wǎng)站優(yōu)化到為企業(yè)提供個(gè)性化軟件開發(fā)等基于互聯(lián)網(wǎng)的全面整合營銷服務(wù)。公司擁有豐富的網(wǎng)站建設(shè)和互聯(lián)網(wǎng)應(yīng)用系統(tǒng)開發(fā)管理經(jīng)驗(yàn)、成熟的應(yīng)用系統(tǒng)解決方案、優(yōu)秀的網(wǎng)站開發(fā)工程師團(tuán)隊(duì)及專業(yè)的網(wǎng)站設(shè)計(jì)師團(tuán)隊(duì)。

前言

先看Android中網(wǎng)絡(luò)請求的進(jìn)化圖:

OkHttp怎么用

HttpURLConnection,Apache HTTP  Client,Volley到現(xiàn)在的OKHttp,可謂天外有天,人外有人。為什么OKHttp會(huì)這么火呢,相信下面的介紹會(huì)告訴你答案。

OKHttp的簡介

首先,給出OKHttp的項(xiàng)目地址:https://github.com/square/okhttp

Android為我們提供了兩種HTTP交互的方式: HttpURLConnection 和 Apache HTTP  Client,雖然兩者都支持HTTPS,流的上傳和下載,配置超時(shí),IPv6和連接池,已足夠滿足我們各種HTTP請求的需求。但更高效的使用HTTP可以讓您的應(yīng)用運(yùn)行更快、更節(jié)省流量。而OkHttp庫就是為此而生。  OkHttp是一個(gè)高效的HTTP庫:

1.支持 SPDY ,共享同一個(gè)Socket來處理同一個(gè)服務(wù)器的所有請求

2.如果SPDY不可用,則通過連接池來減少請求延時(shí)

3.無縫的支持GZIP來減少數(shù)據(jù)流量

1.緩存響應(yīng)數(shù)據(jù)來減少重復(fù)的網(wǎng)絡(luò)請求

2.一般的get請求

3.一般的post請求

4.基于Http的文件上傳

5.文件下載

6.加載圖片

7.支持請求回調(diào),直接返回對象、對象集合

8.支持session的保持

OkHttp會(huì)從很多常用的連接問題中自動(dòng)恢復(fù)。如果您的服務(wù)器配置了多個(gè)IP地址,當(dāng)***個(gè)IP連接失敗的時(shí)候,會(huì)自動(dòng)嘗試下一個(gè)IP。OkHttp還處理了代理服務(wù)器問題和SSL握手失敗問題。(并發(fā))  使用 OkHttp 無需重寫您程序中的網(wǎng)絡(luò)代碼。OkHttp實(shí)現(xiàn)了幾乎和java.net.HttpURLConnection一樣的API。如果您用了  Apache HttpClient,則OkHttp也提供了一個(gè)對應(yīng)的okhttp-apache 模塊。  從上面的簡單介紹中可以知道,雖然在編程上面并不會(huì)簡潔很多,但是OKHttp內(nèi)部的一些功能能夠幫助我們自動(dòng)完成一些很復(fù)雜的操作,筆者個(gè)人認(rèn)為***的賣點(diǎn)就是大大節(jié)省用戶的流量。

OKHttp的基本使用

1、在Gradle中引入CardView的依賴庫。

compile 'com.squareup.okhttp:okhttp:3.8.0'

2、OKHttp在使用之前,首先要了解下面幾個(gè)比較核心的類以及它的功能。

  • OkHttpClient 客戶端對象

  • Request是OkHttp中訪問的請求,Post請求中需要包含RequestBody

  • Builder是輔助類,用于生產(chǎn)對象

  • Response即OkHttp中的響應(yīng),響應(yīng)中可以得到返回是否成功,返回?cái)?shù)據(jù)

  • MediaType 數(shù)據(jù)類型,用來表明是JSON等一系列格式

  • RequestBody 請求數(shù)據(jù),在Post請求中用到

  • client.newCall(request).execute()是同步的請求方法

  • client.newCall(request).enqueue(Callback  callBack)是異步的請求方法,但是Callback里面的代碼是執(zhí)行在子線程的,因此不能更新UI。

3、OKHttp的基本使用步驟(以POST方式從服務(wù)器取JSON數(shù)據(jù)為例)

  • 創(chuàng)建OkHttpClient對象,官方文檔要求我們***使用單例模式,在后文對OKHttp進(jìn)行封裝的時(shí)候會(huì)提到。

  • 如果是post請求的話,需要通過FormEncodingBuilder創(chuàng)建RequestBody對象,指定需要post傳進(jìn)去的參數(shù)。get請求則不用。

  • 創(chuàng)建Request對象,這個(gè)對象是請求對象,需要指定URL。post請求的時(shí)候需要指定RequestBody對象,get請求則不用。

  • 調(diào)用OkHttpClient的newCall方法,把Request對象傳進(jìn)去,然后執(zhí)行execute或者enqueue方法,兩者的區(qū)別在上文已提到。在CallBack中的onResponse方法就可以做你需要做的事。onResponse回調(diào)的參數(shù)是response,一般情況下,比如我們希望獲得返回的字符串,可以通過response.body().string()獲取;如果希望獲得返回的二進(jìn)制字節(jié)數(shù)組,則調(diào)用response.body().bytes();如果你想拿到返回的inputStream,則調(diào)用response.body().byteStream()看到這,你可能會(huì)奇怪,竟然還能拿到返回的inputStream,看到這個(gè)最起碼能意識(shí)到一點(diǎn),這里支持大文件下載,有inputStream我們就可以通過IO的方式寫文件。不過也說明一個(gè)問題,這個(gè)onResponse執(zhí)行的線程并不是UI線程。的確是的,如果你希望操作控件,還是需要使用handler等。

OkHttpClient client = new OkHttpClient();      RequestBody body = new FormEncodingBuilder()             .add("type", "1")             .build();    Request request = new Request.Builder()             .url(Constants.URL_BANNER)             .post(body)             .build();      client.newCall(request).enqueue(new Callback() {         @Override             public void onFailure(Request request, IOException e) {          }          @Override             public void onResponse(Response response) throws IOException {                         if (response.isSuccessful()) {                  android.os.Message msg = new Message();                 msg.what = 1;                 msg.obj = response.body().string();                 mHandler.sendMessage(msg);             }         }     });

這里只是一個(gè)簡單post請求,從服務(wù)器獲取數(shù)據(jù)的介紹,至于get請求只不過是去掉RequestBody對象而已。至于如何向服務(wù)器提交數(shù)據(jù),可以在熟悉上面的基本用法之后查閱官方的WIKI(GitHub的介紹文檔)。

OKHttp的簡單封裝

回顧上面的代碼,試想一下如果每次請求都寫這么多重復(fù)代碼,這樣會(huì)嚴(yán)重降低開發(fā)效率,因此需要對OKHttp進(jìn)行封裝。對代碼進(jìn)行封裝是我們最為面向?qū)ο蟪绦騿T的基本素養(yǎng),減少重復(fù)代碼,降低維護(hù)難度以及成本。

GitHub上也有對OKHttp進(jìn)行過封裝,叫做OKHttpUtils。不過這里我們自己動(dòng)手,一起來學(xué)習(xí)一下如何進(jìn)行封裝。具體的注意點(diǎn)有下面幾點(diǎn):

1、首先,OKHttp官方要求我們***用單例模式去使用OKHttpClient類的,因此我們自定義一個(gè)OKHttpHelper類,并且使用單例模式。

2、對get以及post方法進(jìn)行封裝,主要的思想是把共同的代碼抽取出來,例如代碼中被抽取出來的request方法。

3、對外公開一些靜態(tài)方法,包括get和post方法等。

4、Callback基類,對OKHttp的回調(diào)進(jìn)行封裝。這個(gè)類用里面有一個(gè)type,是方便回調(diào)中使用Gson對JSON進(jìn)行解析的封裝。使用Callback的時(shí)候只需要在泛型中傳入類似Data  、List<Data>即可以方便地使用JSON。

5、由于原來的回調(diào)不在主線程,因此我們需要使用Handler來將回調(diào)放入主線程。

其余的可以參照代碼,有詳細(xì)注釋。

/**  * 這個(gè)類用來輔助OKHttp  */public class OkHttpHelper {    /**      * 采用單例模式使用OkHttpClient      */     private static OkHttpHelper mOkHttpHelperInstance;         private static OkHttpClient mClientInstance;         private Handler mHandler;         private Gson mGson;    /**      * 單例模式,私有構(gòu)造函數(shù),構(gòu)造函數(shù)里面進(jìn)行一些初始化      */     private OkHttpHelper() {         mClientInstance = new OkHttpClient();          mClientInstance.setConnectTimeout(10, TimeUnit.SECONDS);         mClientInstance.setReadTimeout(10, TimeUnit.SECONDS);         mClientInstance.setWriteTimeout(30, TimeUnit.SECONDS);         mGson = new Gson();          mHandler = new Handler(Looper.getMainLooper());     }    /**      * 獲取實(shí)例      *      * @return      */     public static OkHttpHelper getinstance() {                 if (mOkHttpHelperInstance == null) {                         synchronized (OkHttpHelper.class) {                                 if (mOkHttpHelperInstance == null) {                     mOkHttpHelperInstance = new OkHttpHelper();                 }             }         }        return mOkHttpHelperInstance;     }    /**      * 封裝一個(gè)request方法,不管post或者get方法中都會(huì)用到      */     public void request(final Request request, final BaseCallback callback) {        //在請求之前所做的事,比如彈出對話框等         callback.onRequestBefore();          mClientInstance.newCall(request).enqueue(new Callback() {                         @Override             public void onFailure(Request request, IOException e) {                //返回失敗                 callbackFailure(request, callback, e);             }            @Override             public void onResponse(Response response) throws IOException {                                 if (response.isSuccessful()) {                    //返回成功回調(diào)                     String resString = response.body().string();                                     if (callback.mType == String.class) {                        //如果我們需要返回String類型                         callbackSuccess(response, resString, callback);                     } else {                        //如果返回的是其他類型,則利用Gson去解析                         try {                             Object o = mGson.fromJson(resString, callback.mType);                             callbackSuccess(response, o, callback);                         } catch (JsonParseException e) {                             e.printStackTrace();                             callbackError(response, callback, e);                         }                     }                  } else {                    //返回錯(cuò)誤                     callbackError(response, callback, null);                 }             }         });     }    /**      * 在主線程中執(zhí)行的回調(diào)      *      * @param response      * @param resString      * @param callback      */     private void callbackSuccess(final Response response, final Object o, final BaseCallback callback) {         mHandler.post(new Runnable() {                         @Override             public void run() {                 callback.onSuccess(response, o);             }         });     }    /**      * 在主線程中執(zhí)行的回調(diào)      * @param response      * @param callback      * @param e      */     private void callbackError(final Response response, final BaseCallback callback, final Exception e) {         mHandler.post(new Runnable() {                         @Override             public void run() {                 callback.onError(response, response.code(), e);             }         });     }    /**      * 在主線程中執(zhí)行的回調(diào)      * @param request      * @param callback      * @param e      */     private void callbackFailure(final Request request, final BaseCallback callback, final Exception e) {         mHandler.post(new Runnable() {                         @Override             public void run() {                 callback.onFailure(request, e);             }         });     }    /**      * 對外公開的get方法      *      * @param url      * @param callback      */     public void get(String url, BaseCallback callback) {         Request request = buildRequest(url, null, HttpMethodType.GET);         request(request, callback);     }    /**      * 對外公開的post方法      *      * @param url      * @param params      * @param callback      */     public void post(String url, Map<String, String> params, BaseCallback callback) {         Request request = buildRequest(url, params, HttpMethodType.POST);         request(request, callback);     }    /**      * 構(gòu)建請求對象      *      * @param url      * @param params      * @param type      * @return      */     private Request buildRequest(String url, Map<String, String> params, HttpMethodType type) {         Request.Builder builder = new Request.Builder();         builder.url(url);                     if (type == HttpMethodType.GET) {             builder.get();         } else if (type == HttpMethodType.POST) {             builder.post(buildRequestBody(params));         }        return builder.build();     }    /**      * 通過Map的鍵值對構(gòu)建請求對象的body      *      * @param params      * @return      */     private RequestBody buildRequestBody(Map<String, String> params) {          FormEncodingBuilder builder = new FormEncodingBuilder();                     if (params != null) {                             for (Map.Entry<String, String> entity : params.entrySet()) {                 builder.add(entity.getKey(), entity.getValue());             }         }        return builder.build();     }    /**      * 這個(gè)枚舉用于指明是哪一種提交方式      */     enum HttpMethodType {         GET,         POST     }  }

回調(diào)的封裝

package com.nan.cnshop.http;  import com.google.gson.internal.$Gson$Types; import com.squareup.okhttp.Request; import com.squareup.okhttp.Response;  import java.lang.reflect.ParameterizedType; import java.lang.reflect.Type;/**  * 基本的回調(diào)  */public abstract class BaseCallback<T> {    /**      * type用于方便JSON的解析      */     public Type mType;    /**      * 把type轉(zhuǎn)換成對應(yīng)的類,這里不用看明白也行。      *      * @param subclass      * @return      */     static Type getSuperclassTypeParameter(Class<?> subclass) {         Type superclass = subclass.getGenericSuperclass();                 if (superclass instanceof Class) {                         throw new RuntimeException("Missing type parameter.");         }         ParameterizedType parameterized = (ParameterizedType) superclass;                     return $Gson$Types.canonicalize(parameterized.getActualTypeArguments()[0]);     }    /**      * 構(gòu)造的時(shí)候獲得type的class      */     public BaseCallback() {         mType = getSuperclassTypeParameter(getClass());     }    /**      * 請求之前調(diào)用      */     public abstract void onRequestBefore();          /**      * 請求失敗調(diào)用(網(wǎng)絡(luò)問題)      *      * @param request      * @param e      */     public abstract void onFailure(Request request, Exception e);          /**      * 請求成功而且沒有錯(cuò)誤的時(shí)候調(diào)用      *      * @param response      * @param t      */     public abstract void onSuccess(Response response, T t);          /**      * 請求成功但是有錯(cuò)誤的時(shí)候調(diào)用,例如Gson解析錯(cuò)誤等      *      * @param response      * @param errorCode      * @param e      */     public abstract void onError(Response response, int errorCode, Exception e);  }

OKHttp封裝之后的使用

如下面的代碼所示。首先得到OkHttpHelper的單例,然后調(diào)用get方法就可以了。由于繼承了Gson,因此需要在BaseCallback的泛型中傳入JSON對應(yīng)的數(shù)據(jù)類型,筆者這里是List<Banner>。***在onSuccess方法中做我們想要做的事情就可以了。

mHttpHelper=OkHttpHelper.getinstance(); mHttpHelper.get(Constants.URL_BANNER, new BaseCallback<List<Banner>>() {         @Override     public void onRequestBefore() {      }    @Override     public void onFailure(Request request, Exception e) {      }    @Override     public void onSuccess(Response response, List<Banner> banners) {         initBanners(banners);     }    @Override     public void onError(Response response, int errorCode, Exception e) {      } });

是不是覺得封裝之后OKHttp的使用變得很簡單呢,這就是封裝的強(qiáng)大之處,好了今天的筆記到此為止。

以上是“OkHttp怎么用”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對大家有所幫助,如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!

本文標(biāo)題:OkHttp怎么用
分享URL:http://aaarwkj.com/article2/isjjic.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站設(shè)計(jì)公司、搜索引擎優(yōu)化商城網(wǎng)站、網(wǎng)站排名面包屑導(dǎo)航、自適應(yīng)網(wǎng)站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

成都定制網(wǎng)站網(wǎng)頁設(shè)計(jì)
久久91亚洲精品中文字幕| 久久国产精品成人av| 国产视频传媒一区二区| 免费国产三级在线观看| 少妇高潮叫床免费网站在线观看| 精品亚洲一区二区在线| 97超碰97资源在线| 亚洲一区二区精品天堂| 国产亚洲精品视频免费| 欧美日韩av在线一区二区| 热久久这里只有精品网址| 国产高清av免费在线播放| 欧美日韩综合精品无人区| 中文字幕在线日韩精品| 国产精品久久久久精品爆| 欧美一区日韩二区在线| 免费国产污网站在线观看| 中文字幕在线五月婷婷| 黄色永久网站在线播放| 日韩精品高清中文字幕| 亚洲国产成人91精品| 午夜日本大胆裸体艺术| 国产精品精品国产一区二区| 婷婷色精品一区二区激情| 久久精品中文字幕有码日本道| 色哟哟哟哟免费观看视频 | 男人的天堂av免费看看| 尤物视频最新在线观看| 伊人青草免费在线视频| 99热免费精品在线观看| 免费在线观看性生活视频| 人妻少妇中文字幕久久| 日本中文字幕在线一区| 日韩av在线观看大全| 成人又黄又爽大片在线观看| 一区二区精品人妻av| 日韩欧美一区二区免费| 久久人妻一区二区三区免费密臀 | 国产黄片大秀在线观看| 色综合久久国产原创野外| 日韩精品一区二区在线天天狠天 |