天天看點

Rxjava + retrofit + dagger2 + mvp搭建Android架構

最近出去面試,總會被問到我們項目現在采用的什麼開發架構,不過據我的經驗網絡架構(volley)+圖檔緩存(uil)+資料庫(orm)+mvp,不過現在這套架構比較好了,現在采用什麼呢?rxjava + retrofit + dagger2 + mvp。好,那我們接下來說說由這幾種庫來組成我們一個常用的開發架構(當然其他的還有一些什麼推送什麼的我們另當别論)。

借用google的一個mvp的說明圖

Rxjava + retrofit + dagger2 + mvp搭建Android架構

與正常的 mvp 不同的是,在 modle 層和 view 層通過eventbus 連接配接,當資料發生變化時,發出對應的 event,注冊了這個 event 的 view會采取對應的措施。舉個例子,登出用在這樣的情形就很合适,在登出後,我們可能不止一個 view 會發生變化,如果把這些寫在每一個 presenter 中無疑是很不簡潔的代碼

在 modle 層中,抽象出了一個 datamanger,通過datamanger 我們與資料的具體實作進行了解耦,在 p 層我們無需關注資料是來自 db ,sp 還是網絡。我們隻關心拿到的資料對象,而在datamanger 和 具體的資料實作中 還有一層 helper層,這層封裝了對資料的具體操作,比如 dbhelper、sphelper、retrofitservie,有了這一層封裝可以很友善我們進行擴充。

datamanger 和 helper累 中的方法拿到的都是 observeable ,進而友善我們對這個流進行操控。

那麼我們接下來根據這些不同庫,來看看用這幾種庫元件架構怎麼樣呢

項目使用了 dagger2 依賴注入架構解耦個層,使得單測和架構替換變得很容易。想要了解什麼是依賴注入(控制反轉)可以通路如下位址:http://blog.csdn.net/xiangzhihong8/article/details/51707776。

首先看<code>applicationcomponent</code>,他有一個<code>moudle</code>,并且将這個<code>moudle</code>中的提供的構造方法暴露出來,可以看到databasehelper、preferenceshelper等暴露出來的都是全局使用的對象

###

可以看到在<code>applicationmodule</code>中的 provide 方法暴露出的方法對比<code>applicationcomponent</code>中需要的方法,發現還缺了幾項。<code>databasehelper</code>、<code>preferenceshelper</code>、<code>datamanager。</code>

<code></code>

用<code>@inject</code>标注了構造方法,當注入了<code>datamanager</code>時,在<code>module</code>中找不到對應的

provide 方法,變會在構造方法中尋找,在遞歸的找參數中的注入…

以下是使用draggle的一張圖:

Rxjava + retrofit + dagger2 + mvp搭建Android架構

再來看下 retrofit service 中

在建構了 <code>retrofit</code>後再建構<code>service</code>,要是我來寫的話會把<code>retrofit</code>也用

dagger 注入的方式來提供。

datamanger 基本上放的就是業務邏輯了,具體看個例子

在<code>syncribots</code>方法中,我們通過retrofit 獲得網絡的資料,再用 db 存儲,再把結果用<code>observable</code>的結構傳回給

p層,在這個例子中是在一個 service 中調用這個方法