這段時間公司需要將原專案重構成mvp架構,本人蔘考了網上一些關於Android的mvp專案說明和demo,再加上自己專案中的一些實際需求,整理了一份mvp的架構。這個架構使用retrofit作為網路框架,使用post請求方式,並在介面請求時加入了快取機制,使用rxbus替換廣播,整個專案重構+測試耗時兩個星期左右。
由於本專案參考了其他網友的專案,如有網友發現我引用了自己的專案,可以聯絡我,我會在文章中進行說明。下面附上專案連結:
https://github.com/gongchenghao/my_mvp_projectgongchenghao/my_mvp_projectgongchenghao/my_mvp_project
這裡重點說一下快取機制,我在查詢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泛型類進行統一解析
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;
}