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

来源:https://www.cnblogs.com/qinzishuai/archive/2019/09/01/11441365.html
-Advertisement-
Play Games

### MVP簡介 >MVP 全稱:Model-View-Presenter ;MVP 是從經典的模式MVC演變而來,它們的基本思想有相通的[地方](https://baike.baidu.com/item/%E5%9C%B0%E6%96%B9/2262175):Controller/Present ...


### MVP簡介 >MVP 全稱:Model-View-Presenter ;MVP 是從經典的模式MVC演變而來,它們的基本思想有相通的[地方](https://baike.baidu.com/item/%E5%9C%B0%E6%96%B9/2262175):Controller/Presenter負責邏輯的處理,Model提供數據,View負責顯示。 對於MVC不瞭解的朋友可以查此文: [Android進階之路(1)-詳解MVC](https://www.jianshu.com/p/285f6a8d971f) **Android中的MVP:** - M層:適合做一些業務邏輯處理,比如資料庫存取操作,網路操作,複雜的演算法,耗時的任務等都在model層處理。和MVC類似 - V層:對應的Activity,負責xml繪製與頁面交互 - P層:負責View與Model之間的交互 ![](https://img2018.cnblogs.com/blog/1312938/201909/1312938-20190901084219353-399431689.png) ### 為什麼要用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 onLoadDatasListener); } ``` ModelImpl : ``` @Override public void login(String phone, String code, final OnLoadDatasListener 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() { @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也需要變更了,不能如預期的那樣降低耦合度和增加復用性。 大家可以關註我的微信公眾號:「秦子帥」一個有質量、有態度的公眾號! ![公眾號](https://img2018.cnblogs.com/blog/1312938/201909/1312938-20190901084219519-1281896463.jpg)
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • hadoop 開源軟體,可靠的、分散式、可伸縮的框架。 分佈在不同主機上的進程協同在一起構成的應用。 大數據解決了兩個問題 1T = 1024G1P = 1024T1E = 1024P1Z = 1024E1Y = 1024Z1N = 1024Y 1.存儲 分散式存儲 2.計算 分散式計算分散式 由分 ...
  • 1、創建資料庫 登錄MySQL服務後,使用create命令創建資料庫 也可以使用mysqladmin一步創建資料庫 2、連接資料庫 登錄MySQL服務後,使用use命令連接資料庫 3、刪除資料庫 登錄MySQL服務後,使用drop命令創建資料庫 也可以使用mysqladmin一步創建資料庫 ...
  • https://wangde.xin/images/article/mysql/Mysql-dolphin.png ...
  • Hbase表中的每個列,都歸屬與某個列族。列族是表的chema的一部分(而列不是),必須在使用表之前定義。列名都以列族作為首碼。例如courses:history,courses:math 都屬於courses 這個列族。訪問控制、磁碟和記憶體的使用統計都是在列族層面進行的。實際應用中,列族上的控制權... ...
  • 成為數據科學家! 事實上,你可以成為一名真正的數據科學家,且不需要掌握這些技能。NoSQL和MapReduce不是新概念————在這些關鍵詞被創建之前,就有很多人接觸到它們。但要成為一名數據科學家,你需要以下能力。 敏銳的商業頭腦。 真正的大數據專業知識(例如,可以在幾個小時內快速地處理一個5000 ...
  • 一、簡介 Azkaban 主要通過界面上傳配置文件來進行任務的調度。它有兩個重要的概念: Job : 你需要執行的調度任務; Flow :一個獲取多個 Job 及它們之間的依賴關係所組成的圖表叫做 Flow。 目前 Azkaban 3.x 同時支持 Flow 1.0 和 Flow 2.0,本文主要講 ...
  • 重溫下Android和Fragment生命周期,理解生命周期方法的作用,什麼時候調用,可以做一些什麼操作。 1、Android生命周期 1.1 生命周期圖 1.2 生命周期函數說明 onCreate :Activity正在創建,生命周期的第一個方法,需要setContentView載入layout。 ...
  • 鍵值監聽,就是可以監聽對象某個屬性值的變化; 首先,在工程中,新建一個Person的類 在viewController中引入頭文件“Person”,開始測試KVO的使用 運行程式,得出來的值如下: ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...