成人午夜视频全免费观看高清-秋霞福利视频一区二区三区-国产精品久久久久电影小说-亚洲不卡区三一区三区一区

AndroidApp的架構(gòu)設(shè)計:從VM、MVC、MVP到MVVM-創(chuàng)新互聯(lián)

Android應(yīng)用開發(fā)規(guī)模的擴大,客戶端業(yè)務(wù)邏輯也越來越復(fù)雜,已然不是簡單的數(shù)據(jù)展示了。如同后端開發(fā)遇到瓶頸時采用的組件拆分思想,客戶端也需要進行架構(gòu)設(shè)計,拆分視圖和數(shù)據(jù),解除模塊之間的耦合,提高模塊內(nèi)部的聚合度。

北侖ssl適用于網(wǎng)站、小程序/APP、API接口等需要進行數(shù)據(jù)傳輸應(yīng)用場景,ssl證書未來市場廣闊!成為創(chuàng)新互聯(lián)公司的ssl證書銷售渠道,可以享受市場價格4-6折優(yōu)惠!如果有意向歡迎電話聯(lián)系或者加微信:18982081108(備注:SSL證書合作)期待與您的合作!

開始之前先上一張內(nèi)部分享時用的PPT圖:

Android App的架構(gòu)設(shè)計:從VM、MVC、MVP到MVVM

以上是筆者在客戶端開發(fā)過程中面臨的問題,涉及到以下四個主題:

  1. Android App的架構(gòu)設(shè)計:從VM、MVC、MVP到MVVM

  2. Android App的網(wǎng)絡(luò)訪問:支持REST、HTTPS及SPDY的Retrofit+Okhttp

  3. Android App的響應(yīng)式編程:RxJava/RxAndroid解決方案

  4. Android App的依賴注入:Dagger2和ButterKnife使用

本文將從架構(gòu)設(shè)計入手,分享筆者在Android開發(fā)中采用MVC、MVP及MVVM的一些想法。

一、Android原生開發(fā)中的MVC

Android原生開發(fā)采用XML文件實現(xiàn)頁面布局,通過Java在Activity中開發(fā)業(yè)務(wù)邏輯,這種開發(fā)模式實際上已經(jīng)采用了MVC的思想,分離視圖和控制器。MVC模式(Model–view–controller)是軟件工程中的一種軟件架構(gòu)模式,把軟件系統(tǒng)分為三個基本部分:模型(Model)、視圖(View)和控制器(Controller)。

MVC模式最早由Trygve Reenskaug在1978年提出,是施樂帕羅奧多研究中心(Xerox
PARC)在20世紀80年代為程序語言Smalltalk發(fā)明的一種軟件架構(gòu)。MVC模式的目的是實現(xiàn)一種動態(tài)的程序設(shè)計,使后續(xù)對程序的修改和擴展簡化,并且使程序某一部分的重復(fù)利用成為可能。除此之外,此模式通過對復(fù)雜度的簡化,使程序結(jié)構(gòu)更加直觀。軟件系統(tǒng)通過對自身基本部分分離的同時也賦予了各個基本部分應(yīng)有的功能。專業(yè)人員可以通過自身的專長分組:

  • 控制器(Controller)- 負責(zé)轉(zhuǎn)發(fā)請求,對請求進行處理。

  • 視圖(View) - 界面設(shè)計人員進行圖形界面設(shè)計。

  • 模型(Model) - 程序員編寫程序應(yīng)有的功能(實現(xiàn)算法等等)、數(shù)據(jù)庫專家進行數(shù)據(jù)管理和數(shù)據(jù)庫設(shè)計(可以實現(xiàn)具體的功能)。

——以上內(nèi)容來自《維基百科》

在Android編程中,View對應(yīng)xml布局文件,Model對應(yīng)實體模型(網(wǎng)絡(luò)、數(shù)據(jù)庫、I/O),Controller對應(yīng)Activity業(yè)務(wù)邏輯,數(shù)據(jù)處理和UI處理。如下圖所示。

Android App的架構(gòu)設(shè)計:從VM、MVC、MVP到MVVM

但在實際開發(fā)過程中,純粹作為View的各個XML文件功能較弱,Activity基本上都是View和Controller的合體,既要負責(zé)視圖的顯示又要加入控制邏輯,承擔(dān)的功能很多,導(dǎo)致代碼量很大。所有更貼切的目前常規(guī)的開發(fā)說應(yīng)該是View-Model模式,大部分都是通過Activity的協(xié)調(diào),連接處理邏輯的。

二、從MVC過渡到MVP

在業(yè)務(wù)邏輯稍微復(fù)雜一點的頁面,Activity的代碼超過一千是很容易的,如果作者又剛好讀過《如何寫出無法維護的代碼》,那么恭喜后來接手該代碼的童鞋,接下來的幾個月會很酸爽的。。。

既然Activity存在代碼量過大的問題,那自然會想到進行拆分。上節(jié)說到Android原生開發(fā)采用了MVC的思想,但Activity并不是一個標準的MVC模式中的Controller,它的首要職責(zé)是加載應(yīng)用的布局和初始化用戶界面,并接受并處理來自用戶的操作請求,進而作出響應(yīng)。隨著界面及其邏輯的復(fù)雜度不斷提升,Activity類的職責(zé)不斷增加,以致變得龐大臃腫。

MVP是從MVC過渡而來,MVP框架由三部分組成:View負責(zé)顯示,Presenter負責(zé)邏輯處理,Model提供數(shù)據(jù)。Android開發(fā)從MVC過渡到MVP,最主要的變化就是將Activity中負責(zé)業(yè)務(wù)邏輯的代碼移到Presenter中,Activity只充當(dāng)MVP中的View,負責(zé)界面初始化以及建立界面控件與Presenter的關(guān)聯(lián)。

這樣拆分之后,Presenter承擔(dān)了大量的邏輯操作,避免了Activity的臃腫。整個架構(gòu)如下圖所示。

Android App的架構(gòu)設(shè)計:從VM、MVC、MVP到MVVM

  • View(Activity)負責(zé)響應(yīng)用戶操作,通過Presenter暴露的方法請求數(shù)據(jù);

  • Presenter在獲取數(shù)據(jù)后,通過View(Activity)暴露的方法實現(xiàn)界面控制(showLoading/showUsers);

  • Presenter的數(shù)據(jù)是通過Model來獲取的,Model包含網(wǎng)絡(luò)、數(shù)據(jù)庫以及I/O等;

  • Model通過回調(diào)的方式將數(shù)據(jù)傳到Presenter中。

采用MVP明顯的優(yōu)點是避免了傳統(tǒng)開發(fā)模式中View和Model耦合的情況,提高了代碼可擴展性、組件復(fù)用能力、團隊協(xié)作的效率以及單元測試的便利性。但也有一些缺點,比如:

  • Model到Presenter的數(shù)據(jù)傳遞過程需要通過回調(diào);

  • View(Activity)需要持有Presenter的引用,同時,Presenter也需要持有View(Activity)的引用,增加了控制的復(fù)雜度;

  • MVC中Activity的代碼很臃腫,轉(zhuǎn)移到MVP的Presenter中,同樣造成了Presenter在業(yè)務(wù)邏輯復(fù)雜時的代碼臃腫。

三、從Presenter到ViewModel

MVVM是Model-View-ViewModel的簡稱,從實際效果來看,ViewModel是View的數(shù)據(jù)模型和Presenter的結(jié)合,具體結(jié)構(gòu)如下圖所示:

Android App的架構(gòu)設(shè)計:從VM、MVC、MVP到MVVM

  • View(視圖層)采用XML文件進行界面的描述;

  • Model(模型層)通過網(wǎng)絡(luò)和本地數(shù)據(jù)庫獲取視圖層所需數(shù)據(jù);

  • ViewModel(視圖-模型層)負責(zé)View和Model之間的通信,以此分離視圖和數(shù)據(jù)。

View和Model之間通過Android Data Binding技術(shù),實現(xiàn)視圖和數(shù)據(jù)的雙向綁定;ViewModel持有Model的引用,通過Model的方法請求數(shù)據(jù);獲取數(shù)據(jù)后,通過Callback(回調(diào))的方式回到ViewModel中,由于ViewModel與View的雙向綁定,使得界面得以實時更新。同時,界面輸入的數(shù)據(jù)變化時,由于雙向綁定技術(shù),ViewModel中的數(shù)據(jù)得以實時更新,提高了數(shù)據(jù)采集的效率。

采用ViewModel解決MVP中View(Activity)和Presenter相互持有對方應(yīng)用的問題,界面由數(shù)據(jù)進行驅(qū)動,響應(yīng)界面操作無需由View(Activity)傳遞,數(shù)據(jù)的變化也無需Presenter調(diào)用View(Activity)實現(xiàn),使得數(shù)據(jù)傳遞的過程更加簡潔,高效。

在Android中實現(xiàn)MVVM架構(gòu)的核心支撐技術(shù)是Google去年I/O大會開源的Data binding技術(shù),這項技術(shù)的思想并不新穎,最初由微軟提出,在前端開發(fā)中已經(jīng)有成熟的應(yīng)用。下面對其進行簡要的介紹。

四、Android中的Data Binding

學(xué)習(xí)Data Binding主要推薦兩個內(nèi)容:

  1. 官方的Data Binding教程

  2. 精通 Android Data Binding

這兩篇文章中已經(jīng)將Data Binding的基本內(nèi)容描述的很詳細了。這里僅列兩個在實踐中遇到的坑,拋磚引玉。

  • ObservableField的get方法可能無法返回界面實時更新的內(nèi)容

public ObservableField<String> username = new ObservableField<>();

上述username表示用戶名,在界面上可能會與EditText綁定。通過username的set方法可以設(shè)置EditText顯示,但如果輸入變更后,通過get方法卻不一定能及時返回界面的數(shù)據(jù)。

  • Data Binding依然有很多支持的不好的組件(listview,recyclerView等),不可能通過給所有組件綁定ViewModel從而實現(xiàn)Activity沒有業(yè)務(wù)邏輯操作。另外,ViewModel獲取數(shù)據(jù)之后,也不可能把所有數(shù)據(jù)直接綁定到界面,有些也需要通過回調(diào)傳到Activity中。

從MVC、MVP到MVVM,實際上是模型和視圖的分離過程。MVC中模型和視圖沒有完全分離,造成Activity代碼臃腫,MVP中通過Presenter來進行中轉(zhuǎn),模型和視圖徹底分離,但由于V和P互相引用,代碼不夠優(yōu)雅。ViewModel通過Data Binding實現(xiàn)了視圖和數(shù)據(jù)的綁定,解決了這種MVP的缺陷,但目前也存在Data Binding還不成熟的問題。

其實,MVC、MVP及MVVM沒有絕對好壞,在軟件編程過程中,也沒必要非此即彼,最重要的是讓軟件高內(nèi)聚、低耦合、可維護、可擴展,至于架構(gòu),根據(jù)實際情況選擇吧。

另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)cdcxhl.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機、免備案服務(wù)器”等云主機租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價比高”等特點與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。

本文題目:AndroidApp的架構(gòu)設(shè)計:從VM、MVC、MVP到MVVM-創(chuàng)新互聯(lián)
文章鏈接:http://jinyejixie.com/article40/ccphho.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供虛擬主機、定制網(wǎng)站、移動網(wǎng)站建設(shè)、網(wǎng)站導(dǎo)航、商城網(wǎng)站、網(wǎng)站收錄

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

營銷型網(wǎng)站建設(shè)
南陵县| 灵丘县| 黑龙江省| 景东| 曲阳县| 谷城县| 芒康县| 黑河市| 南皮县| 当雄县| 永春县| 都江堰市| 揭西县| 德兴市| 潞西市| 鄄城县| 天等县| 五家渠市| 曲水县| 兴安县| 黄平县| 新沂市| 昔阳县| 吐鲁番市| 岳阳市| 彝良县| 米林县| 繁峙县| 枣阳市| 登封市| 墨脱县| 临西县| 赤城县| 兴城市| 调兵山市| 东源县| 巫溪县| 桃园县| 佛坪县| 洛南县| 平塘县|