MVP for Android: 如何組織顯示層的內容
MVP(Model View Presenter)模式是從眾所周知的MVC(Model View Controller)模式中派生出來的,目前在Android開發中變得越來越重要。越來越多的人在談論MVP,但實際上可靠的、結構化的資料很少。這就是我寫這個部落格的原因,通過它鼓勵大家討論,然後把我們學到的MVP知識以最好的方式應用到我們專案中來。
什麼是MVP?
MVP模式允許從業務邏輯中拆分出表示(presentation)層,因此,所有關於UI介面的東西可以從中分離出來。理想的MVP模式就是在相同的邏輯下,由於View是可互換的,可以有完全不一樣的展示效果。首先要澄清的是MVP並不是體系結構模式,它只負責表示層。在任何情況下,我們都可以在專案中使用它。
為什麼要使用MVP?
在Android開發中有一個問題是來源於Android 中邏輯介面與資料訪問機制是緊密耦合的,我們可以找到像CursorAdapter這樣極端的一個例子,這是一種混合式介面卡,它既融合了介面卡,又有View的成分,而cursor很大程度上應該是訪問層的,所以應該降低資料訪問層的深度。
為了我們的應用程式便於擴充套件和維護,我們應該定義各個分離層。畢竟我們還不知道以後會加入什麼邏輯,是從資料庫檢索資料?還是從Web Service獲取?所以我們必須重做整個檢視。
MVP模式使得檢視獨立於我們的資料來源,我們可將應用程式劃分為至少三個不用的層次,便於我們能夠獨立測試他們。採用MVP模式我們可以把大部分的邏輯從Activity中分離出來,使得我們可以不用藉助單元測試(instrumentation)來單獨測試它。
如何把MVP應用到Android?
一切問題開始變得更加分散,有點複雜了。實現MVP的方式有很多種,我們每個人都可以根據自己的需求和自己喜歡的方式去修改MVP的實現方式,它可以隨著Presenter的複雜程度變化。比如在View中需不需要控制進度條?或者是在Presenter層處理?誰來決定Action Bar該顯示什麼操作?這是一個艱難的決定。這裡我會展示我自己的做法,但是我希望本文成為一個討論如何應用MVP的地方,因為目前為止還沒有實現MVP的標準方式。
Presenter
Presenter主要作為溝通View和Model之間的紐帶,它從Model層取資料,返回給View層,但它不像典型的MVC結構,因為它也可以決定與View層的互動操作。
View
View通常來說是由Activity實現的(或者是Fragment,View,這取決於app的整體結構),它會包含一個Presenter的引用,最理想的Presenter是由一個依賴注入管理器提供,比如Dagger,不過如果不用依賴注入管理器的話,就需要獨立建立Presenter物件了。View要做的事情就僅僅是在每次有介面呼叫的時候(比如按鈕點選後)呼叫Presenter提供的方法。
Model
對於一個結構化的APP來說,Model主要是通向主領域層或者邏輯層的入口,如果使用了Uncle Bob clean architecture的話,Model就可能是一個實現了用例場景的互動工具,這也是我將要在另一篇文章中討論的一個主題。現在,只要把它看做是給View提供資料的容器就可以了。
例子
鑑於已經解釋的太長了,本人寫了一個例子an MVP example on Github
,包含一個登入介面,可以驗證資料然後進入一個帶有列表的主介面,資料來自Model,因為這個例子比較簡單,所以本文就不講解程式碼了,但是如果讀者覺得還是很難理解的話,我還可以再寫一篇文章詳細介紹。
總結
在Android上要分離介面和邏輯其實不容易實現,但是Model-View-Presenter模式可以更輕易的防止在大的專案中的Activity中摻雜太多的程式碼,組織好程式碼結構是開發的最基本的要求,否則,想實現程式碼的穩定性和可擴充套件性就很麻煩了了。
相關文章
- [譯] Android 中的 MVP:如何使 Presenter 層系統化?AndroidMVP
- QT tableWidget 內容居中顯示QT
- Android MVP架構改造~如何重用頂層業務AndroidMVP架構
- 複習Linux如何顯示檔案指定行數的內容Linux
- u盤內容被隱藏win10怎麼顯示_win10 u盤內容不顯示如何恢復Win10
- Linux系統如何顯示檔案的最後幾行內容?Linux
- CSS滑鼠懸停下拉顯示內容CSS
- PbootCMS內容列表只顯示推薦/置頂/頭條內容boot
- chm 檔案開啟只顯示目錄,不顯示內容
- pyqt中的目錄QFileSystemModel 內容用 QTreeView 顯示QTView
- html如何根據檔案路徑顯示檔案內容(pdf)HTML
- SAP Spartacus PageLayoutComponent 如何知道自己應該顯示哪些具體內容
- 顯示檔案內容的Linux命令有哪些?linux如何系統的學習Linux
- ccat – 使用語法突出顯示輸出內容
- PHP顯示文章內容點選數加一PHP
- css如何讓div顯示在最上層CSS
- Flex佈局-垂直居中並換行顯示內容Flex
- Layer.js實現表格溢位內容省略號顯示,懸停顯示全部JS
- js控制文字內容過多時候點選展開方式顯示全部內容demoJS
- Hub:研究顯示觀眾更喜歡Netflix的原創內容
- win10系統如何禁止開始選單搜尋功能顯示Internet的內容Win10
- Flutter 不顯示任何內容,返回哪個Widget 合適?Flutter
- 如何顯示logback內部context狀況Context
- [求助] 如何把 allure 的 index.html 所顯示的內容,展示在 jenkins 傳送的 Email 中?IndexHTMLJenkinsAI
- WIN10動態磁貼不顯示內容怎麼設定 WIN10設定動態磁貼不顯示內容方法Win10
- Geoserver + MySQL實現圖層顯示和文字顯示ServerMySql
- Vue日曆的編寫,可顯示周和月的模式(其中可以自定義日曆裡內容的顯示)Vue模式
- SAP HUM事務程式碼HUMO裡顯示內層和外層HU資訊
- Android Libgdx 顯示文字Android
- WPF/C#:如何顯示具有層級關係的資料C#
- css文字超出div隱藏剩下內容並顯示省略號CSS
- element-ui select input多選內容過多,+1顯示UI
- 分享swoole/go底層內容Go
- dedecms(織夢內容管理系統),又稱織夢cms
- SAP Fiori Elements 應用裡的 Title 顯示的內容是從哪裡來的
- H5頁面PC富文字內容自適應顯示H5
- Android MVP 架構AndroidMVP架構
- WPF/C#:如何將資料分組顯示C#
- 如何把 SAP ABAP 系統裡一張資料庫表的內容,顯示在 Adobe PDF Form 裡資料庫ORM