前言:
在幾個月前,我曾經也寫過這樣的一篇文章,后來回頭看的時候,發現寫的真的是太糟糕了,很多地方沒有寫出說明,而且封裝的思路等也沒寫出來,因此,決定重新寫。
1.為什么要封裝?
簡單粗暴一句話:減少代碼量,方便調用和維護
2.封裝的步驟:
①:定義一個實體類,統一存放請求得到的數據(數據需要和后臺達成一致)
②:定義一個類,用來存放網絡請求的地址
③:定義一個類,用來統一處理網絡請求
④:定義一個類,用來處理網絡請求前,請求后,包括請求失敗,請求成功,沒有網絡的情況
⑤:定義一個類,用來剝離請求后的需要的數據部分(也可以不需要)
現在就開始具體的代碼實現
一:統一的實體類
其中,data就是我們真正需要的數據部分
二:網絡請求地址類
可以看到,我們有一個統一的接口,還有一個登錄的接口地址
三:網絡請求類
我們通過okHttpClient.builder構建出一個httpClientBuilder,并且設置了超時時間,使用的是單利模式,并且返回通過retrofit.create(service)返回一個泛型類,為rxjava做準備
四:網絡請求的操作
我們在請求網絡時,在請求前,請求后都有對應的操作,在發起請求的前,首先我們需要檢查是否有網絡,沒有就告訴用戶,并且不發起請求,否則,就顯示一個對話框告訴用戶正在進行加載數據,請求完成后,對話框消失,如果成功,則把數據回調,否則彈出失敗的原因
(由于代碼比較長,所以采用分段截圖,望大家不要介意)
我們使用一個抽象類,繼承了Subscriber<T>,并且定義的成功和失敗的回調方法,可以看到,當成功后,我們將數據返回,失敗了,則告訴用戶
五:統一的數據剝離
當flag==1的時候,說明請求數據了,我們則需要把數據的data部分抽取出來,否則,我們就彈出錯誤的信息,為什么說這個可以要也可以不要,因為有些時候,我們可能并不需要data部分,也有可能flag有其他的值,需要做不同的處理,所以這個還得看需求,如果我們不需要的時候,我們可以指定請求的線程在io線程,然后回調給主線程就可以了
到這里,基本的封裝就完成了,現在我們來看看怎么用
首先我們需要定義一個接口:
這里的post代表的是post請求,@FormUrlEncoded是表單形式,post里面的是請求的地址,我這里只是示例,在開發中需要換成你自己的請求地址,然后就是一系列的請求參數,具體入參就要自己去換了
我們需要定義一個LoginApi,去發起網絡請求,
通過剛剛的HttpApi中的getService返回對應的接口,并且調用doLogin方法,就可以了,這里注意一下,我現在使用的是不需要成功后就立刻轉成實體類,僅僅只是將請求時放在io線程去處理,通過.compose這個操作符去實現,并且回調給RxSubscibe,我們來看看成功后立刻轉成實體類是怎樣,
可以看出來差別只是少了BaseEntity,這樣的話,就沒有辦法拿到BaseEntity.getFlag()的方法,具體情況看需求
然后,我們在MainActivity中調用
首先我們需要new出Api,然后調用api的doLogin方法
這種是不需要立刻轉成實體類,否則是這樣的
好了,整個RxJava+Retrofit的二次封裝就完成了