AndroidFlux一覽
AndroidFlux是非死book的Flux 架構的Android實現。Flux是非死book在14年提出的一種Web前端架構,主要用來處理復雜的UI邏輯的一致性問題(當時是為了解決Web頁面的消息通知問題)。經過實踐之后發現,這種架構可以很好的應用于Android平臺,相對于其他的MVC/MVP/MVVM等模式,擁有良好的文檔和更具體的設計,比較適合于快速開發實現。
Flux模式最大的特點是單向的數據流,它的UI狀態更新模式繼承了MVC模式的設計思想。Flux并不是具體的框架,而是一套處理UI問題的模式,AndroidFlux同樣不是具體的框架,你不需要導入或者集成任何新的代碼就可以使用,而你需要做的事情是了解這套思想、遵循這種開發模式,查看我們提供的Android代碼示例,寫自己的代碼。

Flux應用程序包含三個主要部分:Dispatcher、Store和View。需要注意的是這和MVC的Model-View-Controller并不是對應關系,這里的View是Controller-View,負責處理UI邏輯和一些簡單的事件分發,而在Android平臺中,完美的對應的到Activity(或Fragment)和相應的布局文件(layout.xml)。Store部分也不是Model(業務Model),而是維護UI狀態的PresentationModel,用來維護一組邏輯相關的UI狀態。Dispatcher不會被直接使用,而是通過通過一個幫助類ActionCreator來封裝Dispatcher,并提供便捷的方法來分發View中產生的事件,消息的傳遞通過Action(Action是一個普通的POJO類)來封裝。
當用戶點擊UI上某個按鈕的時候,一個完整的流程是這樣的:按鈕被點擊觸發回調方法,在回調方法中調用ActionCreator提供的有語義的的方法,ActionCreator會根據傳入參數創建Action并通過Dispatcher發送給Store,所有訂閱了這個Action的Store會接收到訂閱的Action并消化Action,然后Store會發送UI狀態改變的事件給相關的Activity(或Fragment),Activity在收到狀態發生改變的事件之后,開始更新UI(更新UI的過程中會從Store獲取所有需要的數據)。
Store的設計是很精巧的(比較類似PresentationModel模式),每一個Store僅僅負責一片邏輯相關的UI區域,用來維護這片UI的狀態,比如有一個設置界面,它有有很多設置項,那么可以讓它對應一個SettingStore,這個Store僅僅用來維護Setting的狀態。Store對外僅僅提供get方法,它的更新通過Dispatcher派發的Action來更新,當有新的Action進來的時候,它會負責處理Action,并轉化成UI需要的數據。
結構和數據流
在Flux架構的應用中,數據是朝單一方向流動的:
單項數據流是Flux模式的核心,每個使用Flux程序員都應該牢記上圖。Dispatcher、Stores和Views都是獨立的節點,擁有不同的輸入和輸出。Action是一個簡單的對象,包含新的數據和數據類型兩種基本屬性。
Views可以在響應用戶操作的時候產生新的Action:
所有的數據都通過Dispatcher這個樞紐中心傳遞。Action通過ActionCreator的幫助類產生并傳遞給Dispatcher,Action大部分情況下是在用戶和View交互的時候產生。然后Dispatcher會調用Store注冊在其(Dispatcher)中的回調方法, 把Action發送到所有注冊的Store。在Store的回調方法內,Store可以處理任何和自身狀態有關聯的Action。Store接著會觸發一個 change 事件來告知Controller-View數據層發生變化。Controller-View監聽這些事件,在事件處理方法中從Store中讀取數據。Controller-View會調用自己的setState()方法渲染UI。
這種結構很容易讓我們像函數式響應編程(functional-reactive-programming)或者更具的說是數據流(data-flow-programming)編程(flow-based-programming)一樣透析我們的應用,在應用中所有的數據流都是單向,沒有雙向綁定。App的狀態全部是通過Store來維護的,這樣可以允許App的各個部分保持高度的解耦。Store之間有時也會存在依賴,他們會通過一個嚴格的結構來維護,通過來Dispatcher保證數據的同步更新。
數據的雙向綁定會導致層疊更新的問題,比如一個對象導致了另一個對象的更新,另一個對象或許又會導致更多對象的更新。隨著App的增長,這種效應導致無法預測App的那些部分會因為用戶的操作而發生改變。但是當數據的更新只能走一輪的時候(a single round),整個系統就會變得更加可預測。
下面看看Flux應用的各個部分。一個比較好的開始是Dispatcher。
只有一個Dispatcher
在Flux應用中Dispatcher是中心樞紐,管理所有的數據流。它實際上管理的是Store注冊的一系列回調接口,本身沒有其他邏輯 ―― 它僅僅是用來把Action發送到各個Store的一套簡單的機制。每個Store都會把自己注冊到這里,并提供自己的回調方法。當ActionCreator給Dispatcher傳遞一個Action的時候,應用中所有的Store都會通過回調接口收到通知。
隨著App的增長,Dispatcher會變得更加重要,它可以通過調整回調方法的觸發次序來管理Store之間的依賴關系。Store可以聲明等待其他Store更新完畢再更新自己。
Stores
Store包含應用的狀態(state)和邏輯(logic)。它扮演的角色和MVC模式中的Model類似,但是它會管理多個對象的狀態 ―― 它不是像ORM-Model一樣的單獨的數據集。Store負責管理App中一片<strong>區域(Domain)</strong>的狀態,而不是簡單的ORM數據集。
比如,非死book的<a href="https://非死book.com/lookback/edit">LookbackVideoEditor(網頁應用)</a>使用一個TimeStore來跟蹤視頻回放的位置和狀態。同時,使用ImageStore來維護一組圖片集合。在TodoMVC示例中,TotoStore類似的維護一組TodoItems集合。Store的特點是即維護了一組數據集合同時也維護了邏輯區域的狀態(A store exhibits characteristics of both a collection of models and a singleton model of a logical domain)。
如上,Store會把自己注冊在Dispatcher上并提供一個回調接口,回調的參數是Action。在Store實現的回調方法內,會用一個<code>switch</code>語句根據Action類型來處理Action,并提供合適的Hooks來指向Store的一些內部方法(provide the proper hooks into the store's internal methods)。這樣就可以通過Dispatcher發送Action來更新Store的內部狀態。當Store更新后,它會廣播一個事件聲明自己的狀態已經改變了,然后View會讀取這些變化并更新自己。
View和Controller-View
在Flux的網頁應用中,Controller-View是一個比較復雜的概念,它是React框架中提出來的,這種View負責監聽Store的狀態并更新界面。而在Android應用中這變得非常簡單,Controller-View就是Activity或者Fragment,每個Activity或Fragment都負責管理App的一塊功能,負責監聽Store并更新界面。
當View收到來自Store的更新事件時,它先會從Store的getter方法獲取數據,然后調用自己的 <code>setStat()</code>或者<code>foreUpdate</code>方法迫使界面重繪。
通常一個Activity可以對應一個Store,但是當Activity包含幾個Fragment,每個Fragment的功能比較獨立時,也可以讓每個Fragment分別對應自己的Store。
Actions
Dispatcher會提供一個方法來分發事件到Store,并包含一些數據,這通常封裝成一個Action。Action的創建一般被封裝到一個有語境意義的Helper方法(ActionCreator),它會把Action傳給Dispatcher。比如,我們會在Todo-List應用中,改變某條Todo的文字內容,這時可以在ActionCreator類中創建一個方法叫做 <code>updateText(todoId, newText)</code>,然后在View的事件處理方法中調用這個方法,這樣就可以響應用戶事件了。ActionCreator還會給Action添加一個合適的類型,這樣Store就知道如何處理這個Action了,比如在這個例子中,類型可以叫<code>TODO_UPDATE_TEXT</code>。
Action也可能來自其他的地方,比如Server或者緩存,這發生在數據初始化的時候。也有可能發生在服務器返回錯誤碼或者服務器有數據更新的時候(比如推送消息)。
注:一覽部分為Android平臺特別說明,之后的Flux部分譯自非死book的Flux介紹 ,針對Android平臺略有適配。
本文轉載自AndroidFlux網站。該網站專門介紹如何在安卓上實現Flux架構,其github主頁:https://github.com/androidflux/androidflux.github.io
來自: http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2016/0112/3861.html