Android項目框架搭建:mvp+retrofit+rxjava+rxbus

這段時間公司須要將原項目重構成mvp架構,本人蔘考了網上一些關於Android的mvp項目說明和demo,再加上本身項目中的一些實際需求,整理了一份mvp的架構。這個架構使用retrofit做爲網絡框架,使用post請求方式,並在接口請求時加入了緩存機制,使用rxbus替換廣播,整個項目重構+測試耗時兩個星期左右。java

因爲本項目參考了其餘網友的項目,若有網友發現我引用了本身的項目,能夠聯繫我,我會在文章中進行說明。下面附上項目連接:git

https://github.com/gongchenghao/my_mvp_projectgongchenghao/my_mvp_projectgongchenghao/my_mvp_projectgithub

這裏重點說一下緩存機制,我在查找retrofit的時候,並無發現retrofit有自帶的緩存機制,而網上一些針對retrofit進行緩存的方法大多也是針對get請求的,post請求的基本沒有,因而我只能是利用一個緩存的工具類進行緩存,這個工具類能夠設置每一個接口的緩存時間,緩存到期後會從新從服務器端拿最新數據。緩存

如下是我在項目重構時遇到的一些問題的解決方法:服務器

1:使用retrofit訪問網絡時須要先建立javabean,對於一些須要拿到Json才能建立JavaBean或者須要看到Json返回的數據的開發來講,這種網絡

封裝就顯得過猶不及,所以我在初始化retrofit的時候,將addConverterFactory(GsonConverterFactory.create())這個方法註釋掉了,架構

並在APIStores類中將Observable後面的泛型改爲ResponseBody:Observable postDaDian(@FieldMap Map map),框架

這樣在ApiCallback的onSuccess()方法中拿到的就是ResponseBody的對象,經過new String(responseBody.string())就能拿到返回的Json工具

2:爲了防止使用Gson解析Json字符串失敗致使APP崩潰的問題,在解析Json時須要加上try/catch,對此我建立了DefaultParser泛型類進行統一解析post

3:retrofit的緩存問題:經過查閱一些資料我發現retrofit自己並無提供緩存,所以緩存須要咱們本身單獨添加。網上的一些示例可能是針對get

請求添加緩存,而對於post請求,則不多提到。所以我從網上找了一個ACache的緩存工具類,這個工具類能夠設定每一個接口的緩存時間,使用至關靈活。

我將ACache與retrofit結合,在用戶調用Presenter中的網絡請求方法時,若是緩存時間還沒到,就直接返回緩存數據。

4:在沒有使用rxbus傳遞消息以前,通常使用廣播或者eventbus來傳遞數據,此次重構直接使用rxbus來替換大部分的廣播來發送消息,rxbus能夠傳遞各類

類型的數據,好比javabean,hashmap,arraylist,string等,這個在示例demo中均有示例。之因此說替換大部分廣播,是由於項目中用到了鬧鐘功能,這個

是須要發送廣播的。

5:對於在工具類、adapter、dialog中須要訪問網絡的狀況,能夠直接調用retrofit的網絡請求方法,而不用結合mvp和rxjava,可是須要注意的一點是,在

ApiStores中,應該將以前的Observable postGetIocnList(@FieldMap Map map)中的Observable替換成Call

6:rxbus重複接收到消息的問題:重複註冊致使的問題。情景:發送一次消息,收到屢次消息。在作列表刪除時,刪除成功後會調用rxbus發送和接收消息,更新

列表UI。在這裏每次建立adapter都會註冊rxbus,而每次下拉刷新都會從新建立adapter並註冊rxbus,致使rxbus重複註冊。解決方法就是每次註冊時,把當次

註冊的tag加入到ArrayList集合中,下次註冊時,遍歷集合判斷有無該tag,若是有,就不走註冊的代碼了。

public static boolean isAdded(Class tClass)

{

LogUtils.i("傳過來的tClass:"+tClass.toString());

boolean isAdd = false;

for (int i = 0; i

if (tClass.toString().equals(mArrayList.get(i)))

{

isAdd = true;

}

}

return isAdd;

}

相關文章
相關標籤/搜索