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.
毛毛Python進階之路2——實現雙端互聯
毛毛Python進階之路2——實現雙端互聯 1、兩個月前我開始自學Python 2、一個月前我在室友的壓迫下,我用Python優秀的第三方庫requests庫完成了相對正規的爬蟲專案。可以做到批量爬去網路上美眉的圖片【手動滑稽!!!】 連結:https://blog.csdn.ne
Android進階之路
此篇文章隨就業時間而成長~ 1.特殊字元轉義 單引號 ' ' 雙引號 " " 大於號 > > 小於號 &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程式設計師不多呢?這是一