《Android源碼設計模式解析與實戰》讀書筆記(二十六)

來源:互聯網
上載者:User

《Android源碼設計模式解析與實戰》讀書筆記(二十六)
第二十六章、MVP應用構架模式1.MVP介紹

MVP模式是MVC模式的一個演化版本,MVP全稱Model-View-Presenter。目前MVP在Android應用開發中越來越重要了。

在Android中,商務邏輯和資料存取是緊緊耦合的,很多缺乏經驗的開發人員很可能會將各種各樣的商務邏輯塞進某個Activity、Fragment或者自訂View中,這樣會使得這些組件的單個類型臃腫不堪。如果不將具體的商務邏輯抽離出來,當UI變化時,你就需要去原來的View中抽離具體商務邏輯,這必然會很麻煩並且易出錯。

2.使用MVP的好處

(1)MVP模式會解除View與Model的耦合,有效降低View的複雜性。同時又帶來了良好的可擴充性、可測試性,保證系統的整潔性和靈活性。

(2)MVP模式可以分離顯示層與邏輯層,它們之間通過介面進行通訊,降低耦合。理想化的MVP模式可以實現同一份邏輯代碼搭配不同的顯示介面,因為它們之間並不依賴與具體,而是依賴於抽象。這使得Presenter可以運用於任何實現了View邏輯介面的UI,使之具有更廣泛的適用性,保證了靈活度。

3.MVP模式的三個角色

(1)Presenter – 互動中間人:Presenter主要作為溝通ViewModel的橋樑,它從Model層檢索資料後,返回給View層,使得ViewModel之間沒有耦合,也將商務邏輯從View角色上抽離出來。

(2)View – 使用者介面:View通常是指ActivityFragment或者某個View控制項,它含有一個Presenter成員變數。通常View需要實現一個邏輯介面,將View上的操作轉交給Presenter進行實現,最後,Presenter 調用View邏輯介面將結果返回給View元素。

(3)Model – 資料的存取:Model 角色主要是提供資料的存取功能。Presenter 需要通過Model層儲存、擷取資料,Model就像一個資料倉儲。更直白的說,Model是封裝了資料庫DAO或者網路擷取資料的角色,或者兩種資料方式擷取的集合。

4.與MVC、MVVM的區別1.與MVC的區別

從可以看出:MVC的耦合性還是較高的,View可以直接存取Model,導致3者之間構成了迴路。所以兩者的主要區別是,MVP中View不能直接存取Model,需要通過Presenter發出請求,View與Model不能直接通訊。

2.與MVVM(Model-View-ViewModel)的區別

MVVM與MVP非常相似,唯一區別是View和Model進行雙向繫結,兩者之間有一方發生變化則會反應到另一方上。MVVM模式有點像ListView與Adapter、資料集的關係,當資料集發生變化時,調用Adapter的notifyDataSetChanged之後View就直接更新,同時它們之間又沒有耦合,使得ListView變得更加靈活。

5.MVP簡單實現

可以參考:

1. androidmvp

2. archi

6.MVP 與Activity、Fragment的生命週期

由於Presenter 經常性的持有Activity 的強引用,如果在一些請求結束之前Activity 被銷毀了,那麼Presenter 一直持有Activity 對象,使得Activity 對象無法回收,此時就會發生記憶體泄露。

那麼解決方案就是採用弱引用和Activity、Fragment的生命週期來解決這個問題。首先建立一個Presenter 抽象:

public abstract class BasePresenter {    protected Reference mViewRef; //View介面類型的弱引用    public void attachView(T view){        mViewRef = new WeakReference(view); //建立關聯    }    protected T getView(){        return mViewRef.get(); //擷取View    }    public boolean isViewAttached(){        return mViewRef != null && mViewRef.get() != null; //判斷是否與View建立關聯    }    public void detachView(){        if(mViewRef != null){            mViewRef.clear(); //解除關聯            mViewRef = null;        }    }}

通常這個View類型應該就是實現了某個特定介面的Activity或者Fragment等類型。

建立一個MVPBaseActivity基類,通過這個基類聲明周期函數來控制它與Presenter 的關係。代碼如下:

public abstract class MVPBaseActivity> extends Activity {     protected T mPresenter; //Presenter對象    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        mPresenter = createPresenter();        mPresenter.attachView((V)this);    }    @Override    protected void onDestroy() {        super.onDestroy();        mPresenter.detachView();    }    protected abstract T createPresenter();}

MVPBaseActivity含有兩個泛型,一個是View的介面類型,一個是Presenter的具體類型。

7.參考

PS:到這裡《Android源碼設計模式解析與實戰》讀書筆記系列到此就結束了,這本書算算看了也有近2個月了,收穫真是非常大,以後也會抽時間再看幾遍,溫故而知新嘛!在寫這個讀書筆記的過程中,很感謝大家的支援,評論中都是鼓勵的聲音真是給我了很多的信心。最讓我激動的是這本書的作者之一何紅輝也給了我鼓勵,在這裡也是再次感謝。

前一陣看到許多的博友都有寫年度總結,看了之後我也是很有感觸。那我也簡單總結一下:其實做Android開發到現在也有一年半了,雖然稱不上是什麼高手、大神。但是工作上的問題基本也可以獨立解決(畢竟有Google~,畢竟就我一人)同時我對我的工作和學習態度是肯定的。

談談寫部落格的初衷:寫部落格的時間是我做開發基本1年的時候,說來寫部落格也是一個機緣巧合,因為寫部落格之前我會經常看一些開源的項目,就比如Github的android-open-project,那麼我每次都是先進Github在搜尋android-open-project(我竟然連書籤都懶得儲存!),類似的還有很多。。。終於有一天我覺得真麻煩(你是有多遲鈍),所以就把我經常用到的這些網址寫了我的第一篇部落格:Android開源與乾貨網站匯總,之後存一個書籤。嘗到了這種便捷的好處,就正式開始了CSDN部落格之旅。

前幾天碰巧看到一位大神的部落格,看了下這位大神堅持寫了近10年的部落格,並且每月都有高品質的文章,涉及的知識也是方方面面的。真是震撼了我,那麼向榜樣學習,今年繼續努力,既然開始了就堅持下去。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.