前言:
在幾個(gè)月前霎挟,我曾經(jīng)也寫(xiě)過(guò)這樣的一篇文章窝剖,后來(lái)回頭看的時(shí)候,發(fā)現(xiàn)寫(xiě)的真的是太糟糕了酥夭,很多地方?jīng)]有寫(xiě)出說(shuō)明赐纱,而且封裝的思路等也沒(méi)寫(xiě)出來(lái),因此熬北,決定重新寫(xiě)疙描。
1.為什么要封裝?
簡(jiǎn)單粗暴一句話(huà):減少代碼量讶隐,方便調(diào)用和維護(hù)
2.封裝的步驟:
①:定義一個(gè)實(shí)體類(lèi)起胰,統(tǒng)一存放請(qǐng)求得到的數(shù)據(jù)(數(shù)據(jù)需要和后臺(tái)達(dá)成一致)
②:定義一個(gè)類(lèi),用來(lái)存放網(wǎng)絡(luò)請(qǐng)求的地址
③:定義一個(gè)類(lèi)巫延,用來(lái)統(tǒng)一處理網(wǎng)絡(luò)請(qǐng)求
④:定義一個(gè)類(lèi)效五,用來(lái)處理網(wǎng)絡(luò)請(qǐng)求前,請(qǐng)求后烈评,包括請(qǐng)求失敗火俄,請(qǐng)求成功,沒(méi)有網(wǎng)絡(luò)的情況
⑤:定義一個(gè)類(lèi)讲冠,用來(lái)剝離請(qǐng)求后的需要的數(shù)據(jù)部分(也可以不需要)
現(xiàn)在就開(kāi)始具體的代碼實(shí)現(xiàn)
一:統(tǒng)一的實(shí)體類(lèi)
其中,data就是我們真正需要的數(shù)據(jù)部分
二:網(wǎng)絡(luò)請(qǐng)求地址類(lèi)
可以看到适瓦,我們有一個(gè)統(tǒng)一的接口竿开,還有一個(gè)登錄的接口地址
三:網(wǎng)絡(luò)請(qǐng)求類(lèi)
我們通過(guò)okHttpClient.builder構(gòu)建出一個(gè)httpClientBuilder,并且設(shè)置了超時(shí)時(shí)間谱仪,使用的是單利模式,并且返回通過(guò)retrofit.create(service)返回一個(gè)泛型類(lèi)否彩,為rxjava做準(zhǔn)備
四:網(wǎng)絡(luò)請(qǐng)求的操作
我們?cè)谡?qǐng)求網(wǎng)絡(luò)時(shí)疯攒,在請(qǐng)求前,請(qǐng)求后都有對(duì)應(yīng)的操作列荔,在發(fā)起請(qǐng)求的前敬尺,首先我們需要檢查是否有網(wǎng)絡(luò),沒(méi)有就告訴用戶(hù)贴浙,并且不發(fā)起請(qǐng)求砂吞,否則,就顯示一個(gè)對(duì)話(huà)框告訴用戶(hù)正在進(jìn)行加載數(shù)據(jù)崎溃,請(qǐng)求完成后蜻直,對(duì)話(huà)框消失,如果成功袁串,則把數(shù)據(jù)回調(diào)概而,否則彈出失敗的原因
(由于代碼比較長(zhǎng),所以采用分段截圖囱修,望大家不要介意)
我們使用一個(gè)抽象類(lèi)赎瑰,繼承了Subscriber<T>,并且定義的成功和失敗的回調(diào)方法破镰,可以看到餐曼,當(dāng)成功后,我們將數(shù)據(jù)返回啤咽,失敗了晋辆,則告訴用戶(hù)
五:統(tǒng)一的數(shù)據(jù)剝離
當(dāng)flag==1的時(shí)候,說(shuō)明請(qǐng)求數(shù)據(jù)了宇整,我們則需要把數(shù)據(jù)的data部分抽取出來(lái)瓶佳,否則,我們就彈出錯(cuò)誤的信息鳞青,為什么說(shuō)這個(gè)可以要也可以不要霸饲,因?yàn)橛行r(shí)候,我們可能并不需要data部分臂拓,也有可能flag有其他的值厚脉,需要做不同的處理,所以這個(gè)還得看需求胶惰,如果我們不需要的時(shí)候傻工,我們可以指定請(qǐng)求的線程在io線程,然后回調(diào)給主線程就可以了
到這里,基本的封裝就完成了中捆,現(xiàn)在我們來(lái)看看怎么用
首先我們需要定義一個(gè)接口:
這里的post代表的是post請(qǐng)求鸯匹,@FormUrlEncoded是表單形式,post里面的是請(qǐng)求的地址泄伪,我這里只是示例殴蓬,在開(kāi)發(fā)中需要換成你自己的請(qǐng)求地址,然后就是一系列的請(qǐng)求參數(shù)蟋滴,具體入?yún)⒕鸵约喝Q了
我們需要定義一個(gè)LoginApi染厅,去發(fā)起網(wǎng)絡(luò)請(qǐng)求,
通過(guò)剛剛的HttpApi中的getService返回對(duì)應(yīng)的接口津函,并且調(diào)用doLogin方法肖粮,就可以了,這里注意一下球散,我現(xiàn)在使用的是不需要成功后就立刻轉(zhuǎn)成實(shí)體類(lèi)尿赚,僅僅只是將請(qǐng)求時(shí)放在io線程去處理,通過(guò).compose這個(gè)操作符去實(shí)現(xiàn)蕉堰,并且回調(diào)給RxSubscibe凌净,我們來(lái)看看成功后立刻轉(zhuǎn)成實(shí)體類(lèi)是怎樣,
可以看出來(lái)差別只是少了BaseEntity屋讶,這樣的話(huà)冰寻,就沒(méi)有辦法拿到BaseEntity.getFlag()的方法,具體情況看需求
然后皿渗,我們?cè)贛ainActivity中調(diào)用
首先我們需要new出Api斩芭,然后調(diào)用api的doLogin方法
這種是不需要立刻轉(zhuǎn)成實(shí)體類(lèi),否則是這樣的
好了乐疆,整個(gè)RxJava+Retrofit的二次封裝就完成了