06-okhttp的使用以及簡(jiǎn)單封裝_第1頁(yè)
06-okhttp的使用以及簡(jiǎn)單封裝_第2頁(yè)
06-okhttp的使用以及簡(jiǎn)單封裝_第3頁(yè)
06-okhttp的使用以及簡(jiǎn)單封裝_第4頁(yè)
06-okhttp的使用以及簡(jiǎn)單封裝_第5頁(yè)
已閱讀5頁(yè),還剩8頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、一、Android 中網(wǎng)絡(luò)請(qǐng)求的進(jìn)化Android 開(kāi)發(fā)中網(wǎng)絡(luò)編程是必不可少的,不接入互聯(lián)網(wǎng)的 APP 就沒(méi)有言。廢話(huà)不多說(shuō)了,下面請(qǐng)看Android 中網(wǎng)絡(luò)請(qǐng)求的進(jìn)化圖:可OkHttp 會(huì)從很多常用的連接問(wèn)題中自動(dòng)恢復(fù)。如果您的服務(wù)器配置了多個(gè) IP地址,當(dāng)?shù)谝粋€(gè)IP 連接失敗的時(shí)候,會(huì)自動(dòng)嘗試下一個(gè)IP。OkHttp 還處理了代理服務(wù)器問(wèn)題和SSL 握手失敗問(wèn)題。(并發(fā))使用 OkHttp 無(wú)需重寫(xiě)您程序中的網(wǎng)絡(luò)代碼。OkHttp 實(shí)現(xiàn)了幾乎和 .HttpURLConnection 一樣的 API。如果您用了 Apache HttpC nt,則 OkHttp 也提供了一個(gè)對(duì)應(yīng)的okhttp

2、-apache 模塊。從上面的簡(jiǎn)單介紹中可以知道,雖然在編程上面并不會(huì)簡(jiǎn)潔很多,但是OKHttp的一些功能能夠幫助自動(dòng)完成一些很復(fù)雜的操作,筆者個(gè)人認(rèn)為最大的賣(mài)點(diǎn)就是用戶(hù)的流量。三、OKHttp 的基本使用1、在Gradle中引入CardView的依賴(lài)庫(kù)。2、OKHttp 在使用之前,首先要了解下面幾個(gè)比較的類(lèi)以及它的功能。OkHttpCnt 客戶(hù)端對(duì)象Request 是OkHttp 中的請(qǐng)求,t 請(qǐng)求中需要包含RequestBodyBuilder 是輔助類(lèi),用于生產(chǎn)對(duì)象Response 即OkHttp 中的響應(yīng),響應(yīng)中可以得到返回是否成功,返回?cái)?shù)據(jù)MediaType數(shù)據(jù)類(lèi)型,用來(lái)表明是 JS

3、ON 等一系列格式RequestBody 請(qǐng)求數(shù)據(jù),在t 請(qǐng)求中用到cnt.newCall(request).execute()是同步的請(qǐng)求方法compile com.squareup.okhttp:okhttp:2.7.2一般的get 請(qǐng)求一般的t 請(qǐng)求基于Http 的文件上傳文件加載支持請(qǐng)求回調(diào),直接返回對(duì)象、對(duì)象集合支持 ses的保持 3、OKHttp 的基本使用步驟(以T 方式從服務(wù)器取 JSON 數(shù)據(jù)為例)創(chuàng)建 OkHttpCnt 對(duì)象,文檔要求最好使用單例模式,在后文對(duì)OKHttp 進(jìn)行封裝的時(shí)候會(huì)提到。如果是t 請(qǐng)求的話(huà),需要通過(guò) FormEncodingBuilder 創(chuàng)建 R

4、equestBody對(duì)象,指定需要t 傳進(jìn)去的參數(shù)。get 請(qǐng)求則不用。創(chuàng)建 Request 對(duì)象,這個(gè)對(duì)象是請(qǐng)求對(duì)象,需要指定 URL。t 請(qǐng)求的時(shí)候需要指定RequestBody 對(duì)象,get 請(qǐng)求則不用。調(diào)用 OkHttpCnt 的 newCall 方法,把 Request 對(duì)象傳進(jìn)去,然后執(zhí)行 execute 或者 enqueue 方法,兩者的區(qū)別在上文已提到。在 CallBack 中的 onResponse 方法就可以做你需要做的事。onResponse 回調(diào)的參數(shù)是 response,一般情況下,比如希望獲得返回的字符串,可以通過(guò) response.body().string()獲

5、取;如果希望獲得返回的二進(jìn)制字節(jié)數(shù)組,則調(diào)用 response.body().bytes();如果你想拿到返回的 inputStream,則調(diào)用 response.body().byteStream()看到這,你可能會(huì)奇怪,竟然還能拿到返回的 inputStream,看到這個(gè)最起碼能一點(diǎn),這里支持大文件,有inputStream就可以通過(guò)IO 的方式寫(xiě)文件。不過(guò)也說(shuō)明一個(gè)問(wèn)題,這個(gè) onResponse 執(zhí)行的線(xiàn)程并不是 UI 線(xiàn)程。的確是的,如果你希望操作控件,還是需要使用handler 等。cnt.newCall(request).enqueue(Callback callBack)是異步

6、的請(qǐng)求方法,但是Callback 里面的代碼是執(zhí)行在子線(xiàn)程的,因此不能更新 UI。OkHttpCnt cnt = new OkHttpCnt();RequestBody body = new FormEncodingBuilder().add(type, 1).build();Request request = new Request.Builder().url(Constants.URL_BANNER).t(body).build();cnt.newCall(request).enqueue(new Callback() Overridepublic void onFailure(Reque

7、st request, IOException e) Overridepublic void onResponse(Response response) throws IOException if (response.icsful() android.os.Message msg = new Message(); msg.what = 1;msg.obj = response.body().string();mHandler.sendMessage(msg););這里只是一個(gè)簡(jiǎn)單t 請(qǐng)求,從服務(wù)器獲取數(shù)據(jù)的介紹,至于get 請(qǐng)求只不過(guò)是去掉RequestBody 對(duì)象而已。至于如何向服務(wù)器提交

8、數(shù)據(jù),可以在熟悉上面的基本用法之后查閱面這一篇文章,的WIKI(的介紹文檔)。另外楠妹妹也。下四、OKHttp 的簡(jiǎn)單封裝回顧上面的代碼,試想一下如果每次請(qǐng)求都寫(xiě)這么多重復(fù)代碼,這樣會(huì)嚴(yán)重降低開(kāi)發(fā)效率,因此需要對(duì)OKHttp 進(jìn)行封裝。對(duì)代碼進(jìn)行封裝是最為面向?qū)ο蟪绦騿T的基本素養(yǎng),減少重復(fù)代碼,降低難度以及成本。上也有對(duì)OKHttp 進(jìn)行過(guò)封裝,叫做OKHttpUtils。不過(guò)這里自己動(dòng)手,一起來(lái)學(xué)下如何進(jìn)行封裝。具體的有下面幾點(diǎn):1、首先,OKHttp要求最好用單例模式去使用OKHttpCnt 類(lèi)的,因此自定義一個(gè)OKHttpHelper 類(lèi),并且使用單例模式。2、對(duì)get 以及t 方法進(jìn)行

9、封裝,主要的是把共同的代碼抽取出來(lái),例如代碼中被抽取出來(lái)的request 方法。3、對(duì)外公開(kāi)一些靜態(tài)方法,包括get 和t 方法等。4、Callback 基類(lèi),對(duì)OKHttp 的回調(diào)進(jìn)行封裝。這個(gè)類(lèi)用里面有一個(gè) type,是方便回調(diào)中使用Gson 對(duì)JSON 進(jìn)行的封裝。使用Callback 的時(shí)候只需要在泛型中傳入類(lèi)似Data 、List即可以方便地使用JSON。5、由于原來(lái)的回調(diào)不在主線(xiàn)程,因此程。需要使用Handler 來(lái)將回調(diào)放入主線(xiàn)其余的可以參照代碼,有詳細(xì)注釋。importimportandroid.os.Handler;android.os.Looper;import impor

10、t import import import import .gson.Gson;.gson.JsonParseException;com.squareup.okhttp.Callback; com.squareup.okhttp.FormEncodingBuilder; com.squareup.okhttp.OkHttpCnt; com.squareup.okhttp.Request; com.squareup.okhttp.RequestBody;com.squareup.okhttp.Response;import importimportjava.io.IOException; ja

11、va.util.Map;java.util.concurrent.TimeUnit;/* 這個(gè)類(lèi)用來(lái)輔助 OKHttp*/public class OkHttpHelper /* 采用單例模式使用 OkHttpC*/ntprivate privateprivatessic OkHttpHelper mOkHttpHelperInstance;ic OkHttpCnt mCntInstance;Handler mHandler;private Gson mGson;/* 單例模式,私有構(gòu)造函數(shù),構(gòu)造函數(shù)里面進(jìn)行一些初始化*/privatemCOkHttpHelper() ntInstance=

12、new OkHttpCnt();mCmC mCntInstanntInstan ntInstanetConnectTimeout(10, TimeUnit.SECONDS);etReadTimeout(10, TimeUnit.SECONDS); etWriteTimeout(30, TimeUnit.SECONDS);mGson = new Gson();mHandler = new Handler(Looper.getMainLooper();/*獲取實(shí)例*return*/ public sic OkHttpHelper getinstance() if (mOkHttpHelperIns

13、tance = null) synchronized (OkHttpHelper.class) if (mOkHttpHelperInstance = null) mOkHttpHelperInstance = new OkHttpHelper();return mOkHttpHelperInstance;/* 封裝一個(gè) request 方法,不管*/t 或者 get 方法中都會(huì)用到public void request(final Request request, final BaseCallbackcallback) /在請(qǐng)求之前所做的事,比如彈出框等callback.onRequestB

14、efore();mCntInstance.newCall(request).enqueue(new Callback() Overridepublic void onFailure(Request request, IOException e) /返回失敗callbackFailure(request, callback, e);Overridepublic void onResponse(Response response) throws IOExceptionif (response.icsful() /返回成功回調(diào)String resString = response.body().st

15、ring();if (callback.mType = String.class) /如果需要返回String 類(lèi)型callbackSuc else s(response, resString, callback);/如果返回的是其他類(lèi)型,則利用 Gson 去try Object o = mGson.fromJson(resString,callback.mType);callbackSucs(response, o, callback); catch (JsonParseException e) e.prStackTrace();callbackError(response, callbac

16、k, e); else /返回錯(cuò)誤callbackError(response, callback, null););/* 在主線(xiàn)*執(zhí)行的回調(diào)*/paramparam paramresponseresString callbackprivate void callbackSucs(final Response response, finalObjecto, final BaseCallback callback) mHandlost(new Runnable() Overridepublic void run() callback.onSucs(response, o););/* 在主線(xiàn)執(zhí)行的

17、回調(diào) response callbacke*/paramparam paramprivate void callbackError(final Response response, finalBaseCallback callback, final Exception e) mHandlost(new Runnable() Overridepublic void run() callback.onError(response, response.code(), e););/* 在主線(xiàn)執(zhí)行的回調(diào) request callbacke*/param paramparamprivate void ca

18、llbackFailure(final Request request, finalBaseCallback callback, final Exception e) mHandlost(new Runnable() Overridepublic void run() callback.onFailure(request, e););/* 對(duì)外公開(kāi)的 get 方法*param urlparam callback*/public void get(String url, BaseCallback callback) Request request = buildRequest(url, null

19、, HttpMethodType.GET); request(request, callback);/* 對(duì)外公開(kāi)的t 方法*/parampar paramurlarams callbackpublic voidcallback) t(String url, Map params, BaseCallbackRequest request = buildRequest(url, params, HttpMethodType.request(request, callback);T);/* 構(gòu)建請(qǐng)求對(duì)象*/param par paramreturnurlarams typeprivate Requ

20、est buildRequest(String url, Map params, HttpMethodType type) Request.Builder builder = new Request.Builder(); builder.url(url);if (type = HttpMethodType.GET) builder.get(); else if (type = HttpMethodType.T) buildost(buildRequestBody(params);return builder.build();/* 通過(guò) Map 的鍵值對(duì)構(gòu)建請(qǐng)求對(duì)象的 body*pararams

21、return*/private RequestBody buildRequestBody(Map params) FormEncodingBuilder builder = new FormEncodingBuilder();if (params != null) for (Mntry entity : params.entrySet()builder.add(entity.getKey(),entity.getValue();return builder.build();/* 這個(gè)枚舉用于指明是哪一種提交方式*/enum HttpMethodType GET,Tpackageshop.htt

22、p;import importimportcom.gson.ernal.$Gson$Types;com.squareup.okhttp.Request;com.squareup.okhttp.Response;importimportjava.lang.reflect.ParameterizedType;java.lang.reflect.Type;/* 基本的回調(diào)*/public abstract class BaseCallback /* type 用于方便 JSON 的*/public Type mType;/*把 type 轉(zhuǎn)換成對(duì)應(yīng)的類(lèi),這里不用看明白也行。*param subcla

23、ssreturn*/sic 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(paramet

24、erized.getActualTypeArguments()0);/* 構(gòu)造的時(shí)候獲得 type 的 class*/public BaseCallback() mType = getSuperclassTypeParameter(getClass();/* 請(qǐng)求之前調(diào)用*/public abstract void onRequestBefore();/*請(qǐng)求失敗調(diào)用(網(wǎng)絡(luò)問(wèn)題)*param requestparam e*/public abstract void onFailure(Request request, Exceptione);/*請(qǐng)求成功而且沒(méi)有錯(cuò)誤的時(shí)候調(diào)用*param response* param t*/publ

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論