? ? ? 剛畢業(yè)參加工作那會(huì)兒前联,缺乏Android開源項(xiàng)目經(jīng)驗(yàn)失息,工作中發(fā)現(xiàn)一些經(jīng)典開源項(xiàng)目比如OKHttp骏庸,Picasso戚啥,還有一些快速開發(fā)注解框架LoonAndroid等等已經(jīng)相當(dāng)流行杂数,在這些開源庫(kù)之上進(jìn)行開發(fā)可以節(jié)省大量時(shí)間。
? ? ? 對(duì)于初學(xué)者朋友來(lái)說瘸洛,熟悉OKhttp揍移、Gson的使用并簡(jiǎn)單封裝,來(lái)實(shí)現(xiàn)自己的網(wǎng)絡(luò)請(qǐng)求和解析應(yīng)該是比較有必要反肋,我們今天就來(lái)實(shí)現(xiàn)一下那伐。
一、在項(xiàng)目中引入Okhttp3的相關(guān)jar包
?okhttp3的下載地址:https://mvnrepository.com/artifact/com.squareup.okhttp3/okhttp/3.9.0? ? ? ? ? ?okio的下載地址:https://mvnrepository.com/artifact/com.squareup.okio/okio
? ? ?需要注意的是okhttp3依賴于okio石蔗,而且要注意okio的版本罕邀。缺少okio相關(guān)的庫(kù)或者引入okio的版本不對(duì),都有可能在運(yùn)行時(shí)報(bào)錯(cuò)养距。我第一次引入了okio-2.0.0-RC1.jar诉探,報(bào)了Kotlin相關(guān)錯(cuò)誤,實(shí)在令人費(fèi)解铃在,后面改為引入okio-1.13.0.jar這個(gè)版本就正常了阵具。
二碍遍、創(chuàng)建網(wǎng)絡(luò)請(qǐng)求封裝類HttpEntity
? ? ?1定铜、GET請(qǐng)求方法:如代碼所示,整個(gè)請(qǐng)求和返回中有三個(gè)要素:okhttpClient怕敬、request揣炕、callback。分別是請(qǐng)求發(fā)起體东跪,請(qǐng)求內(nèi)容體畸陡,請(qǐng)求返回接收體。例如虽填,我們需要的請(qǐng)求目標(biāo)地址為?HttpConstant.URL丁恭;我們先通過Builer設(shè)定請(qǐng)求體okHttpClient的網(wǎng)絡(luò)連接超時(shí)、網(wǎng)頁(yè)內(nèi)容讀取超時(shí)參數(shù)斋日,并實(shí)例化牲览;然后將目標(biāo)地址URL、請(qǐng)求方式(如果不設(shè)定恶守,如上述代碼第献,那么默認(rèn)就是“GET”方式)寫入請(qǐng)求體request。當(dāng)需要請(qǐng)求時(shí)兔港,就調(diào)用上圖中封裝的request()方法庸毫,就可以通過請(qǐng)求體將內(nèi)容發(fā)送出去,并在傳入的callBack對(duì)象中接收返回了衫樊。
? ? ?2飒赃、POST請(qǐng)求方法:與GET請(qǐng)求方法類似,只不過需要通過RequestBody設(shè)定請(qǐng)求內(nèi)容,并通過request的.method方法傳入請(qǐng)求方式和請(qǐng)求體载佳。同樣的需要傳入callBack對(duì)象來(lái)接收返回晋被。
三、使用GSON將網(wǎng)絡(luò)返回的json字符串轉(zhuǎn)為對(duì)象
? ?gson2.7的下載地址:https://mvnrepository.com/artifact/com.google.code.gson/gson/2.7? ?
? ?下載之別忘記在項(xiàng)目中引入依賴刚盈,完成以上準(zhǔn)備工作之后羡洛,我們嘗試使用GET方式請(qǐng)求上面那個(gè)公共天氣接口,代碼及得到返回結(jié)果如下:
成功得到返回結(jié)果字符串藕漱,下面我們嘗試將json字符串轉(zhuǎn)化為Object對(duì)象欲侮。經(jīng)JSON在線格式化工具處理,得到此JSON字符串大致的結(jié)構(gòu)肋联,下一步我面根據(jù)此結(jié)構(gòu)來(lái)編寫數(shù)據(jù)類來(lái)進(jìn)行接收威蕉。
? ? ?我們根據(jù)返回的JSON數(shù)據(jù)的結(jié)構(gòu),編寫了三個(gè)類橄仍,分別是WeatherData韧涨、TodayWeatherData、BaseWeatherData侮繁,它們均繼承自用于標(biāo)識(shí)結(jié)構(gòu)層級(jí)的BaseData虑粥,根據(jù)結(jié)構(gòu)那么是WeatherData對(duì)象中包含一些數(shù)據(jù)和TodayWeatherData對(duì)象,TodayWeatherData對(duì)象中包含一些數(shù)據(jù)和BaseWeatherData對(duì)象及數(shù)組宪哩。下面我們使用GSON將上述字符串轉(zhuǎn)換成對(duì)象娩贷。
我們?cè)囋嚱Y(jié)果:
? ? 到此我們已經(jīng)實(shí)現(xiàn)了一個(gè)簡(jiǎn)單的OKHTTP+GSON進(jìn)行網(wǎng)絡(luò)請(qǐng)求解析的例子,得到的對(duì)象如果需要進(jìn)程間傳遞锁孟,那么可以實(shí)現(xiàn)Serializable或者Parcelable接口進(jìn)行序列化彬祖,這部分的內(nèi)容我們后續(xù)再探究。
? ? 完整Demo源碼:https://github.com/zhaoyan1994/AndroidOkHttpDemo