寫於2015-06-05
我將專案分為了四個層級:模型層、介面層、核心層、介面層。模型層定義了所有的模型;介面層封裝了伺服器提供的api;核心層處理所有業務邏輯;介面層就處理介面的展示。幾個層級之間的關係如下圖所示: ![這裡寫描述](
介面層封裝了網路底層的api,並提供給核心層呼叫。剛開始,為了簡單,該層的核心類我只定義了4個:
postengine,請求引擎類,對請求的傳送和響應結果進行處理;
response,響應類,封裝了http請求返回的資料結構;
api,介面類,定義了所有介面方法;
apiimpl,介面實現類,實現所有介面方法。
postengine將請求封裝好傳送到伺服器,並對響應結果的json資料轉化為response物件返回。response其實就是響應結果的json資料實體類,json資料是有固定結構的,分為三類,如下:
},],"currentpage":1
,"pagesize":20
,"maxcount":2
,"maxpage":1
}
event為返回碼,0表示成功,msg則是返回的資訊,obj是返回的單個資料物件,objlist是返回的資料物件陣列,currentpage表示當前頁,pagesize則表示當前頁最多物件數量,maxcount表示物件資料總量,maxpage表示總共有多少頁。根據此結構,response基本的定義如下:
publicclass
response
<
t>
每個屬性名稱都要與json資料對應的名稱相一致,否則無法轉化。obj和objlist用泛型則可以轉化為相應的具體物件了。
api介面類定義了所有的介面方法,方法定義類似如下:
publicresponse
<
void
>
login
(string
loginname
,string
password
);public
response
<
versioninfo
>
getlastversion
();public
response
<
list
<
coupon
>>
listnewcoupon
(int
currentpage
,int
pagesize
);
apiimpl則實現所有api介面了,實現**類似如下:
@overridepublic
response
<
void
>
login
(string
loginname
,string
password);
return
postengine
.specialhandle
(method
,params
,typetoken);}
catch
(exceptione)
}
實現中將請求引數和返回的型別定義好,呼叫postengine物件進行處理。
介面層的核心基本上就是這些了。
核心層介於介面層和介面層之間,主要處理業務邏輯,集中做資料處理。向上,給介面層提供資料處理的介面,稱為action;向下,呼叫介面層向伺服器請求資料。向上的action中定義的方法類似如下:publicvoid
getcustomer
(string
loginname
,callbacklistener
<
customer
>
callbacklistener
);
這是乙個獲取使用者資訊的方法,因為需要向介面層請求伺服器api資料,所以新增了callback***,在callback裡對返回的資料結果進行操作。callbacklistener就定義了乙個成功和乙個失敗的方法,**如下:
publicinte***ce
callbacklistener
<
t>
介面的實現基本分為兩步:
引數檢查,檢查引數的合法性,包括非空檢查、邊界檢查、有效性檢查等;
使用非同步任務呼叫介面層的api,返回響應結果。
需要注意的是,action是面向介面的,介面上的資料可能需要根據不同情況呼叫不同的api。
後續擴充套件可以在這裡新增快取,但也要視不同情況而定,比如有些變化太快的資料,新增快取就不太適合了。
模型層橫跨所有層級,封裝了所有資料實體類,基本上也是跟json的obj資料一致的,在介面層會將obj轉化為相應的實體類,再通過action傳到介面層。另外,模型層還定義了一些常量,比如使用者狀態、支付狀態等。在api裡返回的是用1、2、3這樣定義的,而我則用列舉類定義了這些狀態。用列舉類定義,就可以避免了邊界的檢查,同時也更明了,誰會記得那麼多1、2、3都代表什麼狀態呢。然而用列舉類定義的話,就必須能將1、2、3轉化為相應的列舉常量。這裡,我提供兩種實現方式:使用gson的@serializedname標籤,比如0為false,1為true,則可以如下定義:
publicenum
booleantype
通過定義乙個value,如下:
publicenum
booleantype
public
string
getvalue
()}
通過gson的方式,直接訪問true或false就會自動序列化為1或0;如果通過第二種方式,因為沒有序列化,則需要通過getvalue方式獲取1或0。
Android專案重構之路 架構篇
我將專案分為了四個層級 模型層 介面層 核心層 介面層。模型層定義了所有的模型 介面層封裝了伺服器提供的api 核心層處理所有業務邏輯 介面層就處理介面的展示。幾個層級之間的關係如下圖所示 下面展開說明具體的每個層次 介面層封裝了網路底層的api,並提供給核心層呼叫。剛開始,為了簡單,該層的核心類我...
Android專案重構之路 架構篇
寫於2015 06 05 android專案重構之路 架構篇 android專案重構之路 介面篇 android專案重構之路 實現篇 我將專案分為了四個層級 模型層 介面層 核心層 介面層。模型層定義了所有的模型 介面層封裝了伺服器提供的api 核心層處理所有業務邏輯 介面層就處理介面的展示。幾個層...
Android專案重構之路 架構篇
寫於2015 06 05 android專案重構之路 架構篇 android專案重構之路 介面篇 android專案重構之路 實現篇 我將專案分為了四個層級 模型層 介面層 核心層 介面層。模型層定義了所有的模型 介面層封裝了伺服器提供的api 核心層處理所有業務邏輯 介面層就處理介面的展示。幾個層...