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