使用android studio打開該項目。
demo
基于xcore架構寫的一個小demo
xcore
xcoreredux核心代碼庫
pics
文檔的pic資源
android開發當中的code architecture思考
最近看了很多前端的架構,react、flux、redux等,react和redux都是前端比較流行的架構。而android方面,google官方貌似不太care此事,業内也沒有公認的優秀architecture。與前端類似,在android開發中,同樣也面臨着複雜的資料state管理的問題。在了解store、reducer和action的基礎上,最終,基于redux+react的思想,提出了一個基于android平台redux架構,我給它起名叫作:xcoreredux。本倉庫就是xcoreredux+uicomponent架構的實作。它表達的是一種思想,希望大家能夠提出更好的意見。
與前端的redux架構類似,xcoreredux架構的圖示如下:

action 是把資料傳到 store 的有效載體。它是store的唯一資料來源。我們一般是通過 store.dispatch()将action傳到store中。action一般需要兩個參數:type類型和data資料。在xcoreredux架構下,我們定義action如下:
為了統一的管理action,你可以實作一個actioncreator,比如,demo中建立了一個聯系人業務的creator:
action的概念比較好了解,下面我們看一下reducer
reducer的字面意思就是“減速器”。action描述了事件,reducer是決定如何根據action更新狀态(state),而這正是reducer要做的事情。reducer的接口定義如下:
就是根據輸入的action和目前的state,處理得到新的state。
說的更直白一點,reducer就是一些列 純函數 的集合。如demo中的項目所示:
通過上面的reducer實作,我們可以看出,reducer就是一些列函數的集合,其中一個關鍵函數reduce,它按照action的不同type執行不同的方法處理。
store字面意思是存儲。在redux架構下,store和database,file沒有關系,它可不是持久化存儲的意思。store是負責管理資料源的狀态,負責把action和reducer聯系到一起。store的職責為:
1.儲存資料源的目前狀态state
2.對外提供dispatch方法,更新state
3.通過subscribe注冊監聽器,當state變化時,通知觀察者
4.提供getstate方法,擷取目前的state
store的java實作:
在android中,一個redux頁面(fragment或者activity) 隻有一個單一的 store。當需要拆分資料處理邏輯時,應該使用 reducer組合,而不是建立多個store。
與前端的redux搭配react類似,xcoreredux搭配uicomponent。
在前段的react架構下,我們常常聽說元件的概念:‘ui元件’。那麼什麼是ui元件呢?以下圖為例:
紅色的區域為“普通元件”,綠色的區域為兩種不同類型的“item元件”。是以,在uicomponent裡,元件分兩種:普通元件和item元件(或稱為cell元件)。
單元件,比如一個自定義的widget,就是一樣view。比如自定義的circleimageview等。
容器元件,由viewgroup派生出的元件。有framelayout、linearlayout、relativelayout等。還有些常見的清單元件,比如listview或者recyclerview的元件等。
普通元件在xcore中是以framelayout的形式封裝的,編寫一個普通元件隻需要實作如下方法:
1.public int getlayoutresid()
2.public void onviewcreated(view view)
3.實作xcorestore中的istatechangelistener接口,在onstatechanged中做資料綁定
對于前端來說,item元件和普通元件并沒有什麼不同。但是對于android或者ios而言,item元件和普通元件是有本質差別的。以reyclerview為例,item元件在同一種類型下是會複用的。在xcoreredux架構中,定義item元件,需要繼承自xcoreitemuicomponent,它本身并不是一個view。它隻需要實作的方法有:
view oncreateview(layoutinflater inflater,viewgroup container);
與fragment的oncreateview類似,它負責建立item的布局view
void onviewcreated(view view);
與fragment的onviewcreated類似,在此寫view的初始化
public string getviewtype();
item元件對于資料源的類型
public void bindview(ixcorecomponent corecomponent,
xcorerecycleradapter corerecycleradapter,
xcorerecycleradapter.idatawrapper data,
int pos);
資料綁定,當adapter調用bindviewholder時,會回調bindview方法。
item元件需要通過adapter,與對應的清單元件聯系起來。針對android常用的recyclerview,xcoreredux提供了插件式的通用xcorerecycleradapter。
與之前的不同之處在于,這裡把整個清單封裝成一個清單元件,對外提供注冊item,比如xcorerecyclerviewcomponent元件源碼。
我們在使用該元件時,隻需要:
1.在xml中添加元件
2.初始化
對于資料綁定方面,做了兩個優化:
1.把資料通過wrapper包裝
2.使用uibinderhelper做流式綁定,比如:
1.異步
2.middleware中間件
3.與rx結合
<a href="http://cn.redux.js.org/docs/basics/reducers.html">redux中文文檔</a>
<a href="http://armueller.github.io/android/2015/03/29/flux-and-android.html">flux and android</a>
<a href="http://androidflux.github.io/docs/overview.html#content">androidflux一覽</a>