1. 程式人生 > >RxJava+Retrofit+MVP+泛型縮減mvp+模板模式+命令模式+觀察者模式+管理者模式 +簡單工廠模式

RxJava+Retrofit+MVP+泛型縮減mvp+模板模式+命令模式+觀察者模式+管理者模式 +簡單工廠模式

1.App的整個包的部署

  • 整個app採用的是最新的Android api和現在最流行的第三方框架,以及谷歌提倡的MVP設計模式。
  • 整個app分層是按照功能職責來劃分的,ui層是安裝功能模組來劃分的,頁面簡單的直接用Activity來承載頁面,複雜的頁面用Activity+Fragment來做,另外採用的是MVP設計模式,將檢視view和業務邏輯presernter隔離開來。

在這裡輸入圖片描述

2.Api層(網路請求層)

  • 整個app網路請求是rxjava+retrofit+okttp 來完成網路請求的。這一層主要是對網路請求框架的一個封裝方便我們使用。主要處理就是給所有請求新增共同的訊息頭,列印所有請求的log日誌,請求結果的過濾和請求錯誤的通用處理。。。等等。

  • Api層的類圖:

在這裡輸入圖片描述

  • Api主要是將 rxjava+retrofit+okttp 整合到一起,其中包含了網路的攔截器以及請求的通用處理。對網路介面返回的Response進行分割操作 對於jasn 解析錯誤以及返回的 響應實體為空的處理,對每個請求的呼叫執行緒和回撥執行緒的設定。

在這裡輸入圖片描述

在這裡輸入圖片描述

  • Apiservi主要是負責網路請求介面的處理
  • Apiwripper 是Api的輔助類這裡主要是對Apiservi請求的統一處理。
  • MyCallBack 是自定義的網路請求的介面。將網路請求結果統一處理之後, 在回撥MycallBack的實現類

在這裡輸入圖片描述

3.Base層

  • 這一層包含了所有app的基類,類圖:

在這裡輸入圖片描述

  • BaseAcitity為所有Activity的基類,此類為抽象類,採用模板方法模式, 在init()方法中定義一個骨架,而將一些步驟延遲到子類中。使得子類acitivity可以在不改變結構的情況下,實現定義抽象中的某些步驟,這樣所有的Activity都是這樣的一種模式,看著簡單易懂。另外包含了一些Activity常用的方法。

在這裡輸入圖片描述

  • BaseCommonPresenter 為presenter的基類,這裡理做了一些presenter
    初始化的事情,以及一些公用的方法,同時將persenter與view關聯起來

在這裡輸入圖片描述

  • BaseFragment 和 BaseAcitity 一樣採用了採用模板方法模式,另外也定義了一些公用方法(因為Fragment是依賴Activity而存在的所以這裡面的公用方法實際是呼叫Acitity裡面的公用方法),因為頁面顯示有兩種情況一個是直接Activity來顯示,另外一個是用Activity+Fragment來做,這樣Fragment就從當了view層,於是這用泛型將fragment與presenter關聯起來,同樣Activity就從當了view層時BaseAcitity也是這樣。

在LoginFragmentActivity 中,程式碼如下:

圖片9
圖片10

在LoginActivity 中,程式碼如下:

圖片11
圖片12
圖片13

  • BasePresent 和 BaseView 為view介面和preseter介面的父類。

  • HaiBaoApplication 自定義的Application 這對第三方的庫的一些初始化,還有我們自定義的一些東西的初始化,例如: 日誌處理類,全域性圖片載入預設圖片設定。。。等等,對於貫穿真個app的變數和物件也儲存在這裡方便,全域性拿到,比如:使用者資訊物件(User)。。。等等。

  • 對於app的列表展示全部採用谷歌最新的api,用RecylerView來做MyRecylerViewHolder和BaseRecylerAdapter 這兩個基類處理了關於列表介面卡的封裝,BaseRecylerAdapter 在onCreateViewHolder()中返回的是MyRecylerViewHolder這個物件,而不是針對不同的RecylerView返回不同的ViewHolder,MyRecylerViewHolder用SparseArray通過view的id來充當key來儲存view物件的。

在這裡輸入圖片描述

  • 由於RecylerView展示的都是列表資料,於是在BaseRecylerAdapter 用泛型將每一個adaper(介面卡)與與之對應的資料集合關聯起來,構建一個基類adapter,將每個介面卡處理的事情都在這裡共同處理了。同時封裝一些公用的方法,例如:更新列表,移除資料。。。等等對於RecylerView的item的點選事件,在BaseRecylerAdapter 基中定義一個藉口將事件暴露出去。需要注意的是 RecylerView在設定點選事件的時候,要在RecylerView.setadapter 之前的

在這裡輸入圖片描述

4.common層

  • 這層裡面放著一些作用於整個App的一些工具。建議將專案的一些共同的處理以及和業務邏輯不相關的程式碼封裝成一個工具類。

在這裡輸入圖片描述

  • ActivityPagerManager 為Activity的堆疊管理類,另外這裡包含了對Activity資源的釋放,採用的時遞迴的方法,從Activity的根view開始遞迴釋放資源,包含了退出App的處理方法。

在這裡輸入圖片描述

  • CrashHander 是app未捕捉異常的處理類,在除錯階段把錯誤日誌存在手機的資料夾裡面,方便測試出問題了,開發人員可以從手機中找到錯誤日誌,如果釋出的話,將錯誤日誌聯網傳送到第三方錯誤統計。
  • AnimationUtils 處理Acitiity和Fragment裡面view的動畫,能公用的公用,不能共用的單獨在寫個方法。把頁面上的動畫效果都放到這裡來處理
  • MobclickAgentUtils 處理統計友盟事件的工具類也是統計的管理類,這樣有利於觀察整個app統計了那些時間,同時也方便查到一個統計時間在哪裡呼叫了。將頁面所有的統計都用這個類來作為統一 介面來處理。

5.Hybrid 和 hybridModer層

在這裡輸入圖片描述

6.modle層

  • modle層主要包含兩種實體型別,一種是eventbus傳遞事件的事件實體,第二種是api傳送請求後的響應實體

在這裡輸入圖片描述

7.received層

  • app內的廣播層,包含自定義廣播和第三方的廣播等等,例如:極光推送的廣播接受器。

8.RequestParamete 層

  • RequestParamete 傳送請求後的請求實體層。

9.service 層

在這裡輸入圖片描述
* Service 層包含app的自定義service。對於播放音樂採用service來處理(Musicservice),離線下載服務等等

10.ui層

  • ui層是安裝功能模組來劃分的,分為課堂模組,書架模組,發現模組,我的模組。對於頁面的互動採用MVP的模式,例如:如下的登入頁面。用了LoginActivity+LoginFragment來做,LoginActivity裡面承載著LoginFragment,而LoginFragment承載著我們的主要頁面view。loginPreseter處理登入頁面的相關邏輯。

  • Model: 負責資料的檢索,持久化等操作

  • View: 負責UI的繪製和使用者的互動
  • Presenter: 作為Model和View的中間協調部分,負責兩者之間的業務邏輯處理

  • View層
    把View層針對控制元件操作抽象出來一些列的介面
    在Activity或者Fragment裡面實現該介面的控制元件操作,並且初始化Presenter,這是可以看到Activity裡面沒有邏輯處理,只是對UI的控制元件進行資料或者行為的操作,所有的動作都是有Presenter的介面來實現,這樣在專案裡面會極大得精簡Activity的體積.

  • Presenter層
    在Presenter層裡面,Presenter掌握著View和Model的所有介面,Presenter就可以根據不同的業務邏輯通過MV兩層的介面來實現特定的功能,讓M和V獨立出來.

  • 為了減少多的類處理這裡沒有對M層單獨處理,直接交給Presenter層,present直接處理了M層資料模型的處理(資料的獲取,例如:傳送請求獲得實體類),這樣減少了M層的一層介面。

圖片17
圖片18

  • 對於xxxContract是對 Preseter的介面以及view 的管理,在這裡可以看到整個頁面需要呼叫各層之間的介面。

在這裡輸入圖片描述

11.utils層

  • 該層是工具類層。例如:檔案處理工具,圖片處理。。。等等

12.view層

  • 該層是自定義view層。同時也包含第三方的需要自己更改的view

13.widget層

  • 該層是分兩層,一層為dialog層為app對話方塊層,另外一層是popwindow為app popwindow層,每一層都一個管理者採用的門面模式和單利模式。

圖片20
圖片21

14.其他

  • App執行在Andriod 4.1版本以上。