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:如何組織顯示層的內容AndroidMVP
- layui使用彈出層 關閉後彈層的內容又顯示出來UI
- Oracle如何更改show parameter顯示內容的列的格式Oracle
- QT tableWidget 內容居中顯示QT
- 巧用網頁顯示硬碟內容網頁硬碟
- Android studio 如何讓包有層次顯示Android
- u盤內容被隱藏win10怎麼顯示_win10 u盤內容不顯示如何恢復Win10
- 複習Linux如何顯示檔案指定行數的內容Linux
- 自定義UILabel內容顯示內邊距UI
- CSS滑鼠懸停下拉顯示內容CSS
- Android MVP架構改造~如何重用頂層業務AndroidMVP架構
- [譯] Android 中的 MVP:如何使 Presenter 層系統化?AndroidMVP
- Linux系統如何顯示檔案的最後幾行內容?Linux
- Change Organization 會顯示符合什麼條件的庫存組織
- DataView:利用RowDataBound來轉換要顯示的內容View
- html如何根據檔案路徑顯示檔案內容(pdf)HTML
- css如何讓div顯示在最上層CSS
- PHP顯示文章內容點選數加一PHP
- ccat – 使用語法突出顯示輸出內容
- JavaScript操作下拉框動態顯示內容JavaScript
- pyqt中的目錄QFileSystemModel 內容用 QTreeView 顯示QTView
- Win10下鎖屏介面顯示“某些設定由你的組織來管理”如何解決Win10
- Flex佈局-垂直居中並換行顯示內容Flex
- 打造可顯示上傳內容的自定義進度條
- 顯示檔案內容的Linux命令有哪些?linux如何系統的學習Linux
- Layer.js實現表格溢位內容省略號顯示,懸停顯示全部JS
- 世界衛生組織:資料顯示害怕變老的人可能更短命
- js控制文字內容過多時候點選展開方式顯示全部內容demoJS
- ueditor文字框初始化如何顯示預設內容,以及文字框獲取焦點後清空預設內容
- SAP HUM事務程式碼HUMO裡顯示內層和外層HU資訊
- js實現的點選顯示或者隱藏相關內容JS
- 逐行顯示檔案內容並允許修改的DCL指令碼指令碼
- 一個內容分頁、排序、顯示等功能的專案排序
- 更新UITextView後,自動顯示到最下面內容UITextView
- ListView進階系列之一 內容順序淡淡顯示View
- Qt中關於QLabel等其顯示內容的縮放與對齊,動態圖的顯示QT
- Android程式解壓縮zip檔案,並載入顯示解壓後的檔案內容Android
- WIN10動態磁貼不顯示內容怎麼設定 WIN10設定動態磁貼不顯示內容方法Win10