1. 程式人生 > >Android進階之路(2)-詳解MVP

Android進階之路(2)-詳解MVP

MVP簡介

MVP 全稱:Model-View-Presenter ;MVP 是從經典的模式MVC演變而來,它們的基本思想有相通的地方:Controller/Presenter負責邏輯的處理,Model提供資料,View負責顯示。

對於MVC不瞭解的朋友可以查此文: Android進階之路(1)-詳解MVC

Android中的MVP:

  • M層:適合做一些業務邏輯處理,比如資料庫存取操作,網路操作,複雜的演算法,耗時的任務等都在model層處理。和MVC類似

  • V層:對應的Activity,負責xml繪製與頁面互動

  • P層:負責View與Model之間的互動

為什麼要用MVP

我們先想想上篇文章,我們講到為什麼要用MVC,當時我們總結了幾點:

  • 程式碼複用
  • 耦合性低
  • 方便維護的高等

然而我們在寫MVC專案時候,也發現了一些問題: 1.對於Android中的Activity或者Fragment ,我們不能很清晰的區分它是View還是Controller,既有互動又有頁面繪製,這就導致了activity和fragment很“龐大”

2.View與Model確實是分離的,但是關聯性太強,這就導致activity與model的聯絡強,這樣我們只要改一點點程式碼, model 、view、activity 都會變,維護成本太高,View與Model之前的耦合性太高。

而MVP最大的改變就是View與Model實現完全隔離。View把操作意圖給P層,P收到後,會呼叫Model層來實現具體的邏輯, 邏輯實現後會再通知給P, P再通過View的介面回撥給View。即便V和M更改了,也不會有影響,耦合性低。

MVP DEMO

以登入模組為例,來實現MVP

1.定義View介面- ILoginView

 /**
     * 獲取view層的dialog
     *
     * @return retuen
     */
    Dialog getLoadDialog();

    /***
     * 關閉view層的dialog
     */
    void  cancelLoadDialog();

    /**
     * 獲取手機號引數
     *
     * @return username
     */
    String getPhone();

    /**
     * 獲取密碼
     *
     * @return password
     */
    String getCode();

    /**
     * 彈出訊息
     *
     * @param msg msg
     */
    void showMsg(String msg);

View介面大家都明白吧?就是你要告訴給P的意圖。activity實現此介面。並呼叫P的方法:

    @Override
    public void cancelLoadDialog() {

        if (dialog!=null&&dialog.isShowing()){
            dialog.dismiss();
        }

    }

    @Override
    public String getPhone() {
        return edPhone.getText().toString();
    }

    @Override
    public String getCode() {
        return edCode.getText().toString();
    }

    @Override
    public void showMsg(String msg) {
        Toast.makeText(getApplicationContext(),msg,Toast.LENGTH_SHORT).show();
    }

     mPresenter.login();

2.定義Model與ModelImpl Model:

public interface ILoginModel {


    void login(String phone,  String code, OnLoadDatasListener<CurrencyBean.DataBean> onLoadDatasListener);

}

ModelImpl :


    @Override
    public void login(String phone, String code, final OnLoadDatasListener<CurrencyBean.DataBean> onLoadDatasListener) {
    //填寫具體的操作邏輯與onLoadDatasListener回撥
    }

model實現類邏輯處理完成之後會通知給P,定義P:

    /**
     * 登陸
     */
    public void login() {
        if (mView == null) return;
        if (TextUtils.isEmpty(mView.getPhone()) || TextUtils.isEmpty(mView.getCode())) {
            mView.showMsg("手機號或密碼不能為空");
            return;
        }
        mView.getLoadDialog().show();
    loginModel.login(mView.getPhone(), mView.getCode(), new OnLoadDatasListener<CurrencyBean.DataBean>() {
        @Override
        public void onSuccess(CurrencyBean.DataBean dataBean) {
            Gson gson=new Gson();
            mView.cancelLoadDialog();
            Log.e("qzs----   ",gson.toJson(dataBean)+"");
           mView.loginSuccess();
        }



        @Override
        public void onFailure(String error) {
            mView.cancelLoadDialog();
            mView.loginFail();

        }
    });

    }

P通過View介面返回給View

另外MVP也是有缺點的:

  • 增加程式碼的複雜度
  • 實現難度增加
  • 如果某特定檢視的渲染很多(activity),就會造成Presenter與該檢視聯絡過於緊密,一旦該檢視需要變更,那麼Presenter也需要變更了,不能如預期的那樣降低耦合度和增加複用性。

大家可以關注我的微信公眾號:「秦子帥」一個有質量、有態度的公眾號!

相關推薦

Android(2)-MVP

MVP簡介 MVP 全稱:Model-View-Presenter ;MVP 是從經典的模式MVC演變而來,它們的基本思想有相通

Android(1)-MVC

最近因為換工作的原因沒有寫部落格,現在慢慢穩定了,我準備寫一些關於Android 進階的文章,也是為了督促自己學習,大家一起進步!

資料庫事物與隔離級別

>這段時間忙於上線和重構、寫文章的是減少了很多,更新不得不變得遲緩起來~ ## 一、事務的特性 事務是指作為單個邏輯工作單元執行的一系列操作,**要麼都執行成功,要麼都執行失敗**。資料庫事物有四種特徵:即原子性、一致性、隔離性和永續性,也就是我們俗稱的 ACID 特性。事務處理可以確保除只有本事務單

Android - 常見小問題

此篇以後主要記錄我在開發中遇到的問題,用於自我筆記~ APP崩潰,導致一級頁面的fargmentUI層疊 解決方式: /**重寫依賴的activity內onSaveInstanceState 方法 ; 但是格外注意: 註釋呼叫父類方法(如文內的super.

毛毛Python2——實現雙端互聯

毛毛Python進階之路2——實現雙端互聯 1、兩個月前我開始自學Python 2、一個月前我在室友的壓迫下,我用Python優秀的第三方庫requests庫完成了相對正規的爬蟲專案。可以做到批量爬去網路上美眉的圖片【手動滑稽!!!】 連結:https://blog.csdn.ne

Android

此篇文章隨就業時間而成長~ 1.特殊字元轉義 單引號 ' &apos; 雙引號 " &quot; 大於號 > &gt; 小於號 &l

JAVA專案實戰練習-----小白2

今天接著昨天的內容,繼續來完成繪畫板這個專案昨天完成了滑鼠畫筆功能,那麼我們現在實現工具欄的功能,java中的工具欄使用javax.swing.JToolBar類表示,下面把新程式碼插入到DrawPictureFrame.java類中新增完工具欄之後就可以來一步步實現裡面的功

Android——AIDL

一、AIDL AIDL(Android Interface Definition Language)android介面定義語言,它可以用於讓某個service與多個應用程式元件之間進行跨程序通訊,從而可以實現多個應用程式共享一個service的

Spring(2)-ApplicationContext容器以及事件機制

Spring容器最基本的介面是BeanFactory,他負責配置、建立、管理bean,他的子介面之一:ApplicationContext,也叫做spring的上下文。ApplicationConte

Android(一) -- AS 3.0NDK環境搭建及hello world

通過一段找實習的經歷,以及快應用、小程式、web app等移動開發模式的衝擊,深深為安卓原生開發的未來感到擔憂,希望接入人工智慧API和物聯網井噴能給安卓開發帶來新的生機吧。當然,作為小白我是不用擔心這麼多的,做自己喜歡的事就好了,於是拋開雜念,繼續學習安卓。NDK開發環境的

Android(三) -- JNI互動

今天繼續學習C與Java通過JNIEnv互動。昨天學習了C與Java互動方法,但感覺太輕鬆了,就像呼叫findViewById一樣簡單,可能是我遺漏了什麼東西,於是就想在今天繼續研究這一塊兒的內容,順便做一下總結。C呼叫Java的方法和訪問Java中的變數都是通過JNIEnv

Android(二) -- NDK初探

繼續學習NDK開發,今天來實現一個簡單的計算器功能,NativeUtil類中有一個靜態的native方法,它接收三個引數,分別是兩個運算元和一個操作符,並且返回C的計算結果。NativeUtil類定義如下public class NativeUtil { static

Android

我們獲取的IP分區域網與外網,本篇帶來的就是外面ip的獲取方式 注意:許可權新增 (最好以下許可權都進行配置) <uses-permission android:name="android.permission.WRITE_EXTERNAL

Android——NDK(二)

  上一篇部落格介紹了NDK簡介和環境的搭建以及一個簡單的Demo,這篇準備總結一下JNI呼叫Java物件以及在JNI中開啟執行緒。   ps:這裡說明一下,我是用Android Studio開發的,如果是用Eclipse開發的朋友,是不能直接匯入我的程式,而

Android (我的部落格文章目錄)

為了方便讀者閱讀以及自己回顧,總結寫過的文章和一些想要寫的文章目錄如下: #1.Java 反射: 集合: 異常 IO / NIO #2.資料結構與演算法 資料結構: 演算法: #3.設計模式 #4.架構設計 MVC 的思路與實現 MVP 的

淺談Android

熱文導讀 | 點選標題閱讀作者:斜槓Allen地址:http://www.apkbus.com/

Scala-面向對象編程之類的成員

object 創作 構造器 就是 span 進階 作品 strong scala            Scala進階之路-面向對象編程之類的成員詳解                                作者:尹正傑 版權聲明:原創作品,謝絕轉載!否則將追究法律責

樹莓派 (032) -字符問題(2) - 用c語言怎樣得到一個漢字的GB2312編碼(轉)

十六進制 字符串 c++ gb2 十進制 轉換 tails 表示 blog C/C++支持的是ASCII,不過漢字編碼中,GB2312與ASCII是兼容的,所以可以在C中獲得漢字的GB2312編碼 GB2312是兩個字節的,第一字節是高八位,第二字節是低八位,比如下面的程序

翻譯(六)——T-SQL的:超過基礎的2級水平:寫子查詢

相關 完整 圖像 reg 想要 試驗 releases 驗證 不用 T-SQL的進階之路:超過基礎的2級水平:寫子查詢 格雷戈裏·拉森(Gregory Larsen),2016/01/01(第一次出版:2014/01/29) 該系列 這篇文章是樓梯系列的

Android資深工程師

看到一篇文章中提到“最近幾年國內的初級Android程式設計師已經很多了,但是中高階的Android技術人才仍然稀缺“,這的確不假,從我在百度所進行的一些面試來看,找一個適合的高階Android工程師的確不容易,一般需要進行大量的面試才能挑選出一個比較滿意的。為什麼中高階Android程式設計師不多呢?這是一