android mvc使用方法,详细学习android mvc设计模式教程
MVC 是一種使用 MVC(Model View Controller 模型-視圖-控制器)設計創建 web 應用程序的模式。其分層有助于管理復雜的應用程序,因為可以在一個時間內專門關注一個方面。例如,可以在不依賴業務邏輯的情況下專注于視圖設計。同時也讓應用程序的測試更加容易。MVC 分層同時也簡化了分組開發。不同的開發人員可同時開發視圖、控制器邏輯和業務邏輯。
想在你的 Android 應用里優雅地分離出應用狀態、用戶交互和數據表現嗎?
一個開發平臺的設計者是的不會有閑工夫為你量身打造一個高層的應用架構的。但是你恰恰可以利用這一點,充分利用你的自由,根據應用需求和規模來實現你自己的架構。如果你僅僅要做些簡單的小玩意兒,那么好吧,你可以隨意在你的 widgets(像 text fields、spinners 之類的)中存儲數據,然后就在諸如 OnClickListener 中去操控它們。可是話又說回來,如果你要寫些宏偉的應用,或者想讓你的小玩意兒更豐富迷人一點呢?那你還是考慮考慮分個層吧,因為一個好的架構會鼎力支持你去添加新特性,滿足你夢寐以求的高性能、高靈活性、高度響應性等等需求。當然,你的代碼也會因此擺脫蓬頭垢面心亂如麻的糟糕狀態,從此過上幸福的生活……
好吧,說正經的。在接下來的幾分鐘的光陰里,我將帶你看一看如何根據大名鼎鼎的 MVC,來把你的代碼大卸三塊。三塊之間還是藕斷絲連的,比如我會告訴你怎么用 Android 的 messaging 框架,來把 view (V) 和 controller (C) 連一連。我把這一實踐應用到我自己的代碼中,也許它并非 100% 的符合學術標準,也可能不是對每一個 app 都能成為天作之合,但是當我的應用變得越來越龐大的時候,我還是很享受它所給我帶來的好處的。
簡介
關于這個 MVC,我就不多說了吧,到處都可以找到它的“廣告”。我也不介意你到我寫的 里面看一看。你最好先了解了解 Model,View,Controller 這三個東西。另外呢,如果你還沒有看過 ,最好還是去看看吧。盡管這篇文章里沒有完整描述 messaging 這朵奇葩,你還是可以在里面打聽到一些關于線程模型的八卦。接下來我會一直帶你繞著一個樣例轉一轉,轉到最后你會看到樣例的源代碼。
Part 1: Model
把 Model 層泛化,并且讓它只能接觸到主邏輯,這是一個不錯的開端。我們的樣例看起來其實是一目了然加了無趣味,但還是有些有趣的地方。首先,我們有一個單獨的類來包含 model 的“數據”——指的是,在應用的生命周期中, Model 層內可能發生變化的各種狀態。
呃,你沒有看走眼,我的確喜歡加個標注叫 @Immutable,這樣一來我就會銘記這個類事實上是永恒不變的。這樣有很多好處,比如說我能夠在線程之間共享一個類的實例。另外,我還讓這個類 Serializable,這樣可以允許我實現一些例如 “Save/Load” 之類的特性。
至于 Model 類本身,它長成這個樣子:
方法 updateData() 要花一點時間來執行,在真實世界里,它可能是在請求服務器、執行繁重的計算等。data 被 synchronized 好好地保護了起來,不會被并發地訪問。Listeners 也能安全地從并發線程中被添加或刪除。如果你已經和 MVC 有過交往,你會意識到 model 的 listeners 是這個模式的中堅力量——它們讓你能把任何代碼附加到 model 上,而 model 卻對此一無所知(因此 model 的代碼就可以免受任何不相干的邏輯注入的傷害)。
現在來看最有意思的部分——Controller 層。
Part 2: Controller
其實吧,你可以通過很多種方式實現 Controller 這一層。 我選擇的方式是基于 Handler, HandlerThread 與 Message 類的方法。當然,你多少要懂點它們的工作方式。
說到底,Android 平臺讓你可以通過這幾個類來實現應用中各部分之間高效、安全且強大的 messaging 通信。在我們的例子里,我想做的的東西是:
送給 Controller 一個 inbox handler——這樣 View 層就能給他寫信(message)了,信的內容可以是“用戶讓我退出”或者“用戶讓我更新這些數據”以及其它一些甜言蜜語。
送給 Controller 一個或多個 outbox handlers——這樣 Controller 就也能給 View(或 Views,比較多情,你懂得)寫信(message)了,比如“ model 已經更新完了”或者“你自殺吧,我要退出了”,等等。
通過這樣的方式,View 只能把用戶事件裝在信封(message)里寄給 Controller,并不用自己決定怎么對用戶事件進行反應。一旦 Controller 給 View 寄來一封信(message),View 就會無腦地處理 Controller 告訴她的事情,并且給用戶呈現出一些應用的狀態。
通過這樣一個悲情的故事,我們很干凈地就實現了 MVC 的架構,雖然有點不太仁義。
由于 Handler 需要一個 Looper,我們需要選擇一個線程,來運行 Controller 的 inbox handler。我們可以選擇在 UI 線程中(它既能處理 UI 消息,又能處理 Controller 的消息)或者一個新的單獨的 HandlerThread 中來運行。通常我們的 Controller 不會被困在一個很慢的操作中處理它的消息,這樣它才能即使對 View 作出相應。所有很慢的操作都會在后臺線程中運行。因此我們可以放心讓
UI 線程來處理 Controller 消息。但是我還是選擇運行一個單獨的線程,僅僅是因為這樣看起來架構會比較干凈,也可能因為這樣 Controller 的響應會有一點點的更快吧。既然 messageing 框架幫助我們擺脫了并發問題的牢籠,我們可以不用修改大量代碼,就輕易地從一個 solution 跳到另外一個。
來看看我們管理 inbox handler 和 outbox handler 的代碼:
這些并不是 Controller 的完整代碼。先說點其它的我們馬上回來。你現在能看到的是我們如何初始化 inbox handler 與它的線程,如何提交一個 handler 到 outbox handlers 中去,以及如何用一個消息通知所有的 outbox handlers。
有了這些代碼,我們可以得到 inbox handler,并可以從 View 層向它發送消息,同時我們有綁定了 View 的 outbox handler,能夠讓 Controller 與它的 Views 有效地交換異步消息。
為了能處理收到的消息并做點什么,我們需要在 Controller 類中實現 handleMessage() 方法。在大部分應用中,你都可能想在這里實現一個設計模式中的狀態模式的實例,因為根據應用正在處理的工作的不同,我們可能需要對一個消息進行不同的處理,乃至忽略一些消息。例如,在我們的應用中,一旦你開始刷新模型了,你肯定不希望用戶在刷新完成之前再刷新一次。為了表明這一點,我給出了 ControllerState 接口和它的 ReadyState 的實現:
把 Controller 和它的狀態們(stages)放到同一個 package 中,我們可以讓它們使用默認訪問級別就能訪問到 Controller 的內部。我就不把 UpdatingState 的代碼貼這兒了,在頁底的附件中都有。
這里看看 Controller 是怎么把消息處理委托給它的 state 的:
好了,Controller 大概就是這般模樣,現在讓我們介紹個 View 給它認識認識吧。
Part 3: View
不用過多解釋了,我猜你已經知道怎么做了。上代碼(DemoActivity):
在這一樣例中,Activity 實際上占據了 Controller 的實例,而這個 Controller 是控制著 model 的。然而,如果你覺得 Service 的生命周期更能匹配 Controller/Model 的生命周期的話,你也可以考慮把 Controller 轉移到一個 Service 中。
總結
你現在應該很清楚了,基于 message 的方法的的確確能允許我構建一個強大的、復雜的 Controller 與一個完全百依百順的賢惠的 View。這樣我們就有了一個很好的 MVC 的實現。
正如我在開頭所寫的那樣,這一解決方案從理論上講不一定完全有效,也不一定就適合你的 app,但是我已經經歷了構建一個非常復雜應用的過程,這中間有很多種狀態,并且它完全依賴于消息。這一架構會有很多弱點,比如你要在某個地方聚合 message 的代碼(見ControllerProtocol)并在文檔里定義很多 message 參數。但是別忘了好處:它很好地實現了層間的分離,當你的 app 越長越大時,你更會體會到這一框架的美妙。
mvc設計模式詳細分析到這基本交完了,主要是通過簡單的文字和詳細的代碼來介紹了MVC的三部分,分別是Model(模型)、View(視圖)和Controller(控制器)。
總結
以上是生活随笔為你收集整理的android mvc使用方法,详细学习android mvc设计模式教程的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: one more step_KDA新歌《
- 下一篇: jdbc获取mysql第二行表信息_【奇