當前位置:首頁 » 安卓系統 » mvpmvvmandroid

mvpmvvmandroid

發布時間: 2022-09-07 02:04:47

㈠ android mvc和mvp的區別

區別在於

從上圖可以看出:MVC的耦合性還是較高的,View可以直接訪問Model,導致3者之間構成了迴路。所以兩者的主要區別是,MVP中View不能直接訪問Model,需要通過Presenter發出請求,View與Model不能直接通信。

2.與MVVM(Model-View-ViewModel)的區別

MVVM與MVP非常相似,唯一區別是View和Model進行雙向綁定,兩者之間有一方發生變化則會反應到另一方上。MVVM模式有點像ListView與Adapter、數據集的關系,當數據集發生變化時,調用Adapter的notifyDataSetChanged之後View就直接更新,同時它們之間又沒有耦合,使得ListView變得更加靈活。

㈡ Android MVP 開發模式有哪些優缺點

MVP概念:

MVP(Model-View-Presenter) 是總所周知MVC模式的一個演變,主要目的都是劃分模塊職責,降低模塊耦合,易測試,提高代碼復用。

  • 層級責任

  1. Model:負責數據的檢索,持久化等操作。

  2. View: 負責UI的繪制和用戶的交互。

  3. Presenter: 作為Model和View的中間協調部分,負責兩者之間的業務邏輯處理。

  • MVC模式的區別

  1. MVC模式允許View層和Model層直接通訊。

  2. 當某個View的功能很復雜的時候,View和Model的耦合度可能會很高。

  3. MVP模式就沒有這個問題,View會抽象出來一系列操作UI的介面。

  4. Presenter拿到的都是其他兩個層級的介面來做業務邏輯的處理,這樣不僅可以使View和Model之間的耦合度降低,還可以更易得進行單元測試。

  • MVP的優缺點

  1. 優點:降低耦合,層級職責更明顯,易於單元測試。

  2. 缺點:造成類數量爆炸,代碼復雜度和學習成本高,在某些場景下presenter的復用會產生介面冗餘。

㈢ Android實際開發中使用MVP或者MVVM的情況多麼

一些大公司或者比較大的項目是要求使用的,使用MVP或者MVVM會方便以後的代碼維護和閱讀。我目前還沒用過,個人感覺MVP在開發過程反而會麻煩很多。

㈣ 如何構建Android MVVM應用程序

說到Android MVVM,相信大家都會想到Google 2015年推出的DataBinding框架。然而兩者的概念是不一樣的,不能混為一談。MVVM是一種架構模式,而DataBinding是一個實現數據和UI綁定的框架,是構建MVVM模式的一個工具。
之前看過很多關於Android MVVM的博客,但大多數提到的都是DataBinding的基本用法,很少有文章仔細講解在Android中是如何通過DataBinding去構建MVVM的應用框架的。View、ViewModel、Model每一層的職責如何?它們之間聯系怎樣、分工如何、代碼應該如何設計?這是我寫這篇文章的初衷。
接下來,我們先來看看什麼是MVVM,然後再一步一步來設計整個MVVM框架。
MVC、MVP、MVVM
首先,我們先大致了解下Android開發中常見的模式。
MVC
View:XML布局文件。
Model:實體模型(數據的獲取、存儲、數據狀態變化)。
Controllor:對應於Activity,處理數據、業務和UI。
從上面這個結構來看,Android本身的設計還是符合MVC架構的,但是Android中純粹作為View的XML視圖功能太弱,我們大量處理View的邏輯只能寫在Activity中,這樣Activity就充當了View和Controller兩個角色,直接導致Activity中的代碼大爆炸。相信大多數Android開發者都遇到過一個Acitivty數以千行的代碼情況吧!所以,更貼切的說法是,這個MVC結構最終其實只是一個Model-View(Activity:View&Controller)的結構。
MVP
View: 對應於Activity和XML,負責View的繪制以及與用戶的交互。
Model: 依然是實體模型。
Presenter: 負責完成View與Model間的交互和業務邏輯。
前面我們說,Activity充當了View和Controller兩個角色,MVP就能很好地解決這個問題,其核心理念是通過一個抽象的View介面(不是真正的View層)將Presenter與真正的View層進行解耦。Persenter持有該View介面,對該介面進行操作,而不是直接操作View層。這樣就可以把視圖操作和業務邏輯解耦,從而讓Activity成為真正的View層。
但MVP也存在一些弊端:
Presenter(以下簡稱P)層與View(以下簡稱V)層是通過介面進行交互的,介面粒度不好控制。粒度太小,就會存在大量介面的情況,使代碼太過碎版化;粒度太大,解耦效果不好。同時對於UI的輸入和數據的變化,需要手動調用V層或者P層相關的介面,相對來說缺乏自動性、監聽性。如果數據的變化能自動響應到UI、UI的輸入能自動更新到數據,那該多好!
MVP是以UI為驅動的模型,更新UI都需要保證能獲取到控制項的引用,同時更新UI的時候要考慮當前是否是UI線程,也要考慮Activity的生命周期(是否已經銷毀等)。
MVP是以UI和事件為驅動的傳統模型,數據都是被動地通過UI控制項做展示,但是由於數據的時變性,我們更希望數據能轉被動為主動,希望數據能更有活性,由數據來驅動UI。
V層與P層還是有一定的耦合度。一旦V層某個UI元素更改,那麼對應的介面就必須得改,數據如何映射到UI上、事件監聽介面這些都需要轉變,牽一發而動全身。如果這一層也能解耦就更好了。
復雜的業務同時也可能會導致P層太大,代碼臃腫的問題依然不能解決。
MVVM
View: 對應於Activity和XML,負責View的繪制以及與用戶交互。
Model: 實體模型。
ViewModel: 負責完成View與Model間的交互,負責業務邏輯。
MVVM的目標和思想與MVP類似,利用數據綁定(Data Binding)、依賴屬性(Dependency Property)、命令(Command)、路由事件(Routed Event)等新特性,打造了一個更加靈活高效的架構。
數據驅動
在常規的開發模式中,數據變化需要更新UI的時候,需要先獲取UI控制項的引用,然後再更新UI。獲取用戶的輸入和操作也需要通過UI控制項的引用。在MVVM中,這些都是通過數據驅動來自動完成的,數據變化後會自動更新UI,UI的改變也能自動反饋到數據層,數據成為主導因素。這樣MVVM層在業務邏輯處理中只要關心數據,不需要直接和UI打交道,在業務處理過程中簡單方便很多。
低耦合度
MVVM模式中,數據是獨立於UI的。
數據和業務邏輯處於一個獨立的ViewModel中,ViewModel只需要關注數據和業務邏輯,不需要和UI或者控制項打交道。UI想怎麼處理數據都由UI自己決定,ViewModel不涉及任何和UI相關的事,也不持有UI控制項的引用。即便是控制項改變了(比如:TextView換成EditText),ViewModel也幾乎不需要更改任何代碼。它非常完美的解耦了View層和ViewModel,解決了上面我們所說的MVP的痛點。
更新UI
在MVVM中,數據發生變化後,我們在工作線程直接修改(在數據是線程安全的情況下)ViewModel的數據即可,不用再考慮要切到主線程更新UI了,這些事情相關框架都幫我們做了。
團隊協作
MVVM的分工是非常明顯的,由於View和ViewModel之間是鬆散耦合的:一個是處理業務和數據、一個是專門的UI處理。所以,完全由兩個人分工來做,一個做UI(XML和Activity)一個寫ViewModel,效率更高。
可復用性
一個ViewModel可以復用到多個View中。同樣的一份數據,可以提供給不同的UI去做展示。對於版本迭代中頻繁的UI改動,更新或新增一套View即可。如果想在UI上做A/B Testing,那MVVM是你不二選擇。
單元測試
有些同學一看到單元測試,可能腦袋都大。是啊,寫成一團漿糊的代碼怎麼可能做單元測試?如果你們以代碼太爛無法寫單元測試而逃避,那可真是不好的消息了。這時候,你需要MVVM來拯救。
我們前面說過了,ViewModel層做的事是數據處理和業務邏輯,View層中關注的是UI,兩者完全沒有依賴。不管是UI的單元測試還是業務邏輯的單元測試,都是低耦合的。在MVVM中數據是直接綁定到UI控制項上的(部分數據是可以直接反映出UI上的內容),那麼我們就可以直接通過修改綁定的數據源來間接做一些Android UI上的測試。
通過上面的簡述以及模式的對比,我們可以發現MVVM的優勢還是非常明顯的。雖然目前Android開發中可能真正在使用MVVM的很少,但是值得我們去做一些探討和調研。
如何構建MVVM應用框架
如何分工
構建MVVM框架首先要具體了解各個模塊的分工。接下來我們來講解View、ViewModel、Model它們各自的職責所在。
View
View層做的就是和UI相關的工作,我們只在XML、Activity和Fragment寫View層的代碼,View層不做和業務相關的事,也就是我們在Activity不寫業務邏輯和業務數據相關的代碼,更新UI通過數據綁定實現,盡量在ViewModel裡面做(更新綁定的數據源即可),Activity要做的事就是初始化一些控制項(如控制項的顏色,添加RecyclerView的分割線),View層可以提供更新UI的介面(但是我們更傾向所有的UI元素都是通過數據來驅動更改UI),View層可以處理事件(但是我們更希望UI事件通過Command來綁定)。簡單地說:View層不做任何業務邏輯、不涉及操作數據、不處理數據,UI和數據嚴格的分開。
ViewModel
ViewModel層做的事情剛好和View層相反,ViewModel只做和業務邏輯和業務數據相關的事,不做任何和UI相關的事情,ViewModel 層不會持有任何控制項的引用,更不會在ViewModel中通過UI控制項的引用去做更新UI的事情。ViewModel就是專注於業務的邏輯處理,做的事情也都只是對數據的操作(這些數據綁定在相應的控制項上會自動去更改UI)。同時DataBinding框架已經支持雙向綁定,讓我們可以通過雙向綁定獲取View層反饋給ViewModel層的數據,並對這些數據上進行操作。關於對UI控制項事件的處理,我們也希望能把這些事件處理綁定到控制項上,並把這些事件的處理統一化,為此我們通過BindingAdapter對一些常用的事件做了封裝,把一個個事件封裝成一個個Command,對於每個事件我們用一個ReplyCommand去處理就行了,ReplyCommand會把你可能需要的數據帶給你,這使得我們在ViewModel層處理事件的時候只需要關心處理數據就行了,具體見MVVM Light Toolkit 使用指南的 Command 部分。再強調一遍:ViewModel 不做和UI相關的事。
Model
Model層最大的特點是被賦予了數據獲取的職責,與我們平常Model層只定義實體對象的行為截然不同。實例中,數據的獲取、存儲、數據狀態變化都是Model層的任務。Model包括實體模型(Bean)、Retrofit的Service ,獲取網路數據介面,本地存儲(增刪改查)介面,數據變化監聽等。Model提供數據獲取介面供ViewModel調用,經數據轉換和操作並最終映射綁定到View層某個UI元素的屬性上。
如何協作
關於協作,我們先來看下面的一張圖:

上圖反映了MVVM框架中各個模塊的聯系和數據流的走向,我們從每個模塊一一拆分來看。那麼我們重點就是下面的三個協作。
ViewModel與View的協作。
ViewModel與Model的協作。
ViewModel與ViewModel的協作。
ViewModel與View的協作

圖2中ViewModel和View是通過綁定的方式連接在一起的,綁定分成兩種:一種是數據綁定,一種是命令綁定。數據的綁定DataBinding已經提供好了,簡單地定義一些ObservableField就能把數據和控制項綁定在一起了(如TextView的text屬性),但是DataBinding框架提供的不夠全面,比如說如何讓一個URL綁定到一個ImageView,讓這個ImageView能自動去載入url指定的圖片,如何把數據源和布局模板綁定到一個ListView,讓ListView可以不需要去寫Adapter和ViewHolder相關的東西?這些就需要我們做一些工作和簡單的封裝。MVVM Light Toolkit 已經幫我們做了一部分的工作,詳情可以查看MVVM Light Toolkit 使用指南。關於事件綁定也是一樣,MVVM Light Toolkit 做了簡單的封裝,對於每個事件我們用一個ReplyCommand去處理就行了,ReplyCommand會把可能需要的數據帶給你,這樣我們處理事件的時候也只關心處理數據就行了。
由圖1中ViewModel的模塊中我們可以看出ViewModel類下面一般包含下面5個部分:
Context (上下文)
Model (數據源 Java Bean)
Data Field (數據綁定)
Command (命令綁定)
Child ViewModel (子ViewModel)
我們先來看下示例代碼,然後再一一講解5個部分是幹嘛用的:
//contextprivate Activity context;//model(數據源 Java Bean)private NewsService.News news;private TopNewsService.News topNews;//數據綁定,綁定到UI的欄位(data field)public final ObservableField<String> imageUrl = new ObservableField<>();public final ObservableField<String> html = new ObservableField<>();public final ObservableField<String> title = new ObservableField<>();// 一個變數包含了所有關於View Style 相關的欄位public final ViewStyle viewStyle = new ViewStyle();//命令綁定(command)public final ReplyCommand onRefreshCommand = new ReplyCommand<>(() -> {

})public final ReplyCommand<Integer> onLoadMoreCommand = new ReplyCommand<>((itemCount) -> {

});//Child ViewModelpublic final ObservableList<NewItemViewModel> itemViewModel = new ObservableArrayList<>();/** * ViewStyle 關於控制項的一些屬性和業務數據無關的Style 可以做一個包裹,這樣代碼比較美觀,
ViewModel 頁面也不會有太多太雜的欄位。 **/public static class ViewStyle {
public final ObservableBoolean isRefreshing = new ObservableBoolean(true);
public final ObservableBoolean progressRefreshing = new ObservableBoolean(true);
}
Context

㈤ android mvvm和mvp哪個好

沒有那個好那個不好一說,大項目需要用到框架做以後的維護升級,小項目沒必要去強套什麼框架,反而會變得麻煩。

㈥ Android 目前是 mvc,mvp,mvvm 哪種模式比較好

mvc的界面和邏輯關聯緊密,數據直接從資料庫讀取。mvvm的界面與viewmode是松耦合,界面數據從viewmodel中獲取。如果你寫代碼的時候在界面的cs文件里有很多業務邏輯代碼,那麼你使用的就不是mvvm,而是mvc

㈦ Android MVP與MVC的區別和理解

MVP架構:
View不直接與Model交互,而是通過與Presenter交互來與Model間接交互。
Presenter與View的交互是通過介面來進行的。
通常View與Presenter是一對一的,但復雜的View可能綁定多個Presenter來處理邏輯。
MVC架構:
View可以與Model直接交互。
Controller是基於行為的,並且可以被多個View共享。
可以負責決定顯示哪個View。

㈧ android mvp mvvm怎麼選擇 簡書

1.MVC
傳統的Android App其實都是基於MVC的,Activity,Fragment相當於C,布局相當於V,數據邏輯相當於M
隨著業務的增長Controller里的代碼會越來越臃腫,因為它不只要負責業務邏輯,還要控制View的展示。也就是說Activity、Fragment雜糅了Controller和View,耦合變大。並不能算作真正意義上的MVC。
這也是為什麼後面的MVP會引起很多開發者興趣的原因了。
2.MVP
MVP架構其實可以說與MVC的架構還是有很大的差別的,數據邏輯相當於M,Activity(負責View的繪制以及與用戶交互)相當於V ,View於Model間的交互則為P
理論上感覺區別有點抽象,可以通過下面的圖來看一看其中的區別

㈨ android開發mvvm模式是不是已經成熟

android開發mvvm模式不是很成熟,現在成熟的開發模式是mvc,mvp模式就是邏輯代碼與界面分離開來處理,更清晰。

熱點內容
cbs加密 發布:2024-05-19 06:29:56 瀏覽:200
ssis存儲過程 發布:2024-05-19 06:21:31 瀏覽:630
怎樣刪除小視頻文件夾 發布:2024-05-19 05:49:29 瀏覽:589
開啟php短標簽 發布:2024-05-19 05:44:12 瀏覽:473
android各國語言 發布:2024-05-19 05:42:54 瀏覽:247
微信什麼資料都沒怎麼找回密碼 發布:2024-05-19 05:35:34 瀏覽:907
填志願密碼是什麼 發布:2024-05-19 05:30:23 瀏覽:318
城堡爭霸自動掠奪腳本 發布:2024-05-19 05:22:06 瀏覽:204
asp編程工具 發布:2024-05-19 05:20:36 瀏覽:143
insertpython 發布:2024-05-19 05:12:26 瀏覽:244