系列文章:
1-準(zhǔn)備工作
2-搭建項(xiàng)目框架
3-功能實(shí)現(xiàn)
4-加入網(wǎng)絡(luò)緩存
承上關(guān)于App重構(gòu)的幾個(gè)方面主要也是說(shuō)的架構(gòu)重構(gòu), 本系列嘗試以開發(fā)一個(gè)Github客戶端為例, 記錄個(gè)人在開發(fā)一個(gè)App項(xiàng)目過(guò)程中的一個(gè)基本流程, 以及所采用的架構(gòu), 技術(shù)的運(yùn)用, 在此過(guò)程也會(huì)說(shuō)明下如何規(guī)避上文提到的一些代碼,架構(gòu)等問(wèn)題.
1, 架構(gòu)選擇
毋庸置疑, MVP架構(gòu)是目前開發(fā)Android App最火的架構(gòu), 可能MVVM更加吸引人, 但是MVP更加成熟且易于上手. 相比與Activity/Fragment包攬一切的傳統(tǒng)開發(fā)架構(gòu)又更加靈活, 便于產(chǎn)品的更新迭代(特別是UI上的變化, 你懂的, 這也是產(chǎn)品們最喜歡變動(dòng)的部分).
故此次開發(fā)的Github客戶端將采用MVP架構(gòu):
- Model
- 對(duì)外提供業(yè)務(wù)數(shù)據(jù)API.
- 內(nèi)部實(shí)現(xiàn)本地?cái)?shù)據(jù), 網(wǎng)絡(luò)數(shù)據(jù)的存取等.
- 只有Presenter可以訪問(wèn), 與View隔離
- Presenter
- 持有View對(duì)象, 對(duì)View進(jìn)行操作
- 持有Model層提供的數(shù)據(jù)接口對(duì)象, 可通過(guò)依賴注入解耦此部分.
- 從數(shù)據(jù)接口對(duì)象中獲取數(shù)據(jù)并處理, 更新View.
- View
- UI層, 包含所有UI相關(guān)組件.
- 持有對(duì)應(yīng)的Presenter的對(duì)象, 可通過(guò)依賴注入解耦此部分.
- 由Presenter來(lái)負(fù)責(zé)更新UI.
2, 服務(wù)器API熟悉
當(dāng)前大部分的App是需要與服務(wù)器交互的, 在開發(fā)之前, 我們也需要簡(jiǎn)單了解下Github提供的API.
因?yàn)镚ithub提供了詳盡的開發(fā)指南, 在此就不詳述了.
值得一提的是, Github API的標(biāo)準(zhǔn)的Restful架構(gòu)的API, 這個(gè)是大贊的~
3, 開源庫(kù)選擇
快速開發(fā)一個(gè)項(xiàng)目, 且抱著不重復(fù)造輪子的思想, 選擇一些開源庫(kù)輔助開發(fā)是很必要的. 當(dāng)然, 同類的開源庫(kù)可能很多, 選擇上可能更多是個(gè)人喜好和使用習(xí)慣的問(wèn)題, 在此不做比較(可以哪天單立個(gè)開源庫(kù)選擇的話題討論下).
以下根據(jù)個(gè)人經(jīng)驗(yàn)和當(dāng)前項(xiàng)目的情況初步選擇的一些庫(kù):
網(wǎng)絡(luò)請(qǐng)求
- Retrofit
- 一個(gè)類型安全(Type-Safety)的基于RESTful架構(gòu)的Android(Java)客戶端實(shí)現(xiàn)【凉茫基于注解社付,動(dòng)態(tài)代理等技術(shù)。
- 源碼地址
- 官方教程
- 項(xiàng)目中使用此框架來(lái)做服務(wù)器接口交互燃箭。
- Retrofit只是一個(gè)RESTful的架構(gòu)冲呢,可以通過(guò)它定義和服務(wù)器的接口形態(tài),然而真正的HTTP請(qǐng)求還是需要借助HttpConnection或其他方式去完成的招狸,這就用到了同由Square組織開發(fā)的OkHttp敬拓。
- OkHttp
圖片加載
圖片加載的庫(kù)也有很多, 老牌的UIL(Universal-Image-Loader), google推的Glide, Square組織的Picasso, 以及facebook新晉的Fresco.
各有千秋, 關(guān)于這幾個(gè)的比較可以參考StackOverFlow上的這個(gè)問(wèn)題.
在此個(gè)人選擇Glide.
- Glide
- 另外, 個(gè)人習(xí)慣, 為了擁抱變化, 我會(huì)在Glide的基礎(chǔ)上再封裝一層, 以便可以很方便的替換成其他的庫(kù). 如下:
public class ImageLoader {
public static void load(Context context, Uri uri, ImageView view) {
Glide.with(context)
.load(uri)
.centerCrop()
.into(view);
}
}
如需替換成Picasso, 僅僅修改ImageLoader這個(gè)文件即可, 由于Picasso的調(diào)用方式和Glide幾乎一樣, 我們要做的可能只是將Glide換成Picasso而已, 如下:
// 將Glide換成Picasso
// Glide.with(context)
Picasso.with(context)
...
Rx支持
- RxJava
- 一個(gè)使用Observable序列實(shí)現(xiàn)包含異步和基于事件的編程方式框架量瓜。
- 擴(kuò)展自觀察者模式,實(shí)現(xiàn)數(shù)據(jù)途乃、事件序列绍傲,并提供了很多Operators可以隨意轉(zhuǎn)換Observable,而無(wú)需顧慮線程安全,并發(fā)同步等烫饼。
- 源碼地址
- 官方教程
- 給 Android 開發(fā)者的 RxJava 詳解
- ReactiveX文檔中文翻譯
- Awesome-RxJava
- RxAndroid
- RxLifecycle
- RxBinding
- Jake大神的大作, 用來(lái)將View的事件轉(zhuǎn)換成Rx模式 (大家可以跟隨項(xiàng)目見(jiàn)證它的妙處).
- 源碼地址
依賴注入
這個(gè)一般會(huì)選擇大名鼎鼎的Dagger了, 現(xiàn)在使用的基本都是google fork修改之后的Dagger2.
數(shù)據(jù)庫(kù)相關(guān)
這個(gè)也有很多選擇, 個(gè)人一般使用GreenDAO, 主要是其編譯生成類文件, 比較清晰, 便于看清原理.
另外, 最近Realm, 極其火爆, 說(shuō)是基于移動(dòng)設(shè)備打造的數(shù)據(jù)庫(kù), 拋棄SQLite的存在, 可以在練手項(xiàng)目中嘗試下.
輔助
- Logger
- LeakCanary
- DBinspector
還有項(xiàng)目過(guò)程中還會(huì)根據(jù)實(shí)際情況增減一些庫(kù), 到時(shí)再說(shuō).
另外可能會(huì)引入一些注入自定義View, 動(dòng)畫等相關(guān)的庫(kù), 也是根據(jù)產(chǎn)品的實(shí)際情況而定.
至此, 一個(gè)App項(xiàng)目的前期工作基本就緒了(當(dāng)然, 這個(gè)是作為一個(gè)簡(jiǎn)單的自研項(xiàng)目而言, 如果是公司產(chǎn)品, 還需更多的產(chǎn)品方面的準(zhǔn)備, 在此單論技術(shù)方面).
接下來(lái), 就會(huì)開始搭建項(xiàng)目框架了, 敬請(qǐng)期待.