Android開源 - 基于Gank.IO提供的API的第三方客戶端(RxJava+Retrofit+MVP)
之所以再次寫關于 [干貨IO] 的文章,就是想紀錄一下做這個app的心路歷程,以及介紹一下里面的技術實現。
先說下這個3.0版本更新的主要內容吧
- 1.UI風格大調整,全新的 UI 風格
- 2.支持干貨配圖
- 3.新增 gank 最近推出的閑讀
- 4.新增搜索
- 5.修復僅Wifi加載圖片的bug
- 6.行為更改:長按干貨收藏
下面是應用部分截圖:
p1
p2.jpg
p3.jpg
為了不影響文章的可讀性,這里就不放太多的截圖了,感興趣的可以去安裝體驗。
好了,開始正題。
干貨IO 1.0
大概是今年3月份的時候關注了gan.io這個網站,這上面每天都會提供很多的技術干貨,后面的時間我也是受益良多,與此同時也知道了drakeet為之做的一個 App Meizhi ,這個App最近好像有更新,非常好的一個開源項目,從這個項目中我也學到了很多。眾所周知,gan.io是客戶端最多的一個網站,應用市場一搜索就可以搜到很多關于gank的應用,但這些應用都有一個共同點,沒有收藏功能,我個人感覺收藏功能還是比較重要的,他可以防止以后想回過來再看的時候不用花太多的時間去一頁一頁的找,這個就是我最開始想做這個App的的主要動機。于是就有了 干貨IO 1.0 的出現,也是一個完全開源項目,在今年五月份就提交到了github,只有查看最新干貨,分類瀏覽和收藏三個功能,只能說達到了預期目標,做的相對而言也比較的粗糙,App并不是那么流暢。
1.0系列版本有過好幾次更新,大多改動都不太大,基本上都是些bug的修復和一些小功能的增加,最大的一次改動就是使用 RxJava + Retrofit + MVP重構這個項目了,底層的代碼改動算是比較大的,由于時間上的原因這次重構并不是太徹底,也因此造成了代碼的混亂。說到這里我們來簡單說說RxJava 、 Retrofit 、 MVP這三個技術吧,我相信大家對這三個技術肯定也不陌生。
RxJava可以以流的方式去處理我們的數據,線程的切換上也是十分的方便,可以大大減少代碼量,網絡上也涌現出了相關的庫,很大程度上方便了我們的開發,RxJava相關的文章可以去我管理的專題看看 RxJava系列專題(Android方向) ,這個專題基本上收錄完了簡書上關于RxJava最好的文章,當然,你有相關的比較好的文章也可以往這個專題投稿。
Retrofit是Square公司出品的又一大神器,一個高質量的http庫,現在十分流行,網上關于他的文章也是多不勝數,他極大化的簡化了我們的網絡請求,使得我們的代碼更加可讀,以及方便后期的維護,加上RxJava簡直就是完美 。
MVP是Android目前比較受歡迎的一種設計模式,個人感覺這個庫比較適合于多人共同維護開發的大項目,一般的項目用MVP開發,會多出很多的類文件,有點影響開發效率,1.0版本就試過用MVP去重構項目,最后發現大大增大了我們的工作量,本來很快就能完成的一個功能,增加了很多的類文件,最后到了3.0版本我果斷去掉了MVP(還殘留了一部分)。項目開發的時候應該實際情況去選擇設計模式,而不是盲目的套用現在十分流行的。
干貨IO 2.0
這個版本在功能上其實沒什么改變,只是調整了一下UI,把側滑菜單中的部門功能放到了底部選項卡中,加入了谷歌最新推出的 BottomNavigationBar 。
干貨IO 3.0
這個版本變化時比較大的,斷斷續續的花了我一周的時間去做,基本上是完全重構之前所有的代碼,這次的重構是的代碼更加的干凈,比較有學習的價值,網絡請求完全采用Retrofit+RxJava,網絡請求也更加的清晰可控,新增了搜索和閑讀,干貨有了Gif配圖,應用也更具MD的風格,在這里必須感謝下 Android-Proficiency-Exercise ,分類列表的UI樣式就來源于他。剛開始在做gif圖加載的時候,加載十分的慢,并且內存使用也十分的大,最后經過查閱資料把Glide的緩存策略改為 DiskCacheStrategy.SOURCE 就可以了。列表的Adapter使用的是drakeet的 MultiType ,這個庫處理含有多種itemType的RecyclerView非常的棒!如果還不知道這個庫的,我強烈推薦使用。同時我基于 MultiType 也封裝了一個通用列表的抽象類,很簡單的就能實現一個列表,添加頭部這個都不是事,最簡單的列表只需實現loadData方法。
@Override
public void loadData(final int pageIndex) {
ServiceFactory.getInstance().createService(GankService.class)
.getGanHuo(mType, pageIndex)
.compose(TransformUtils.<HttpResult<List<GanHuoDataBean>>>defaultSchedulers())
.subscribe(new Subscriber<HttpResult<List<GanHuoDataBean>>>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
showError(new Exception(e));
}
@Override
public void onNext(HttpResult<List<GanHuoDataBean>> listHttpResult) {
onDataSuccessReceived(pageIndex, listHttpResult.results);
}
});
}
上面的代碼來源于分類列表Fragment,具體的實現可以去看文章末尾的源碼。好了差不多就是這些了,這里貼代碼也沒有什么意義,反而影響文章的可閱讀性,用到了哪些技術文章中也提到了,這個App綜合了我前面好幾篇博客的內容,也算是對之前講解的技術的一個綜合應用,并且應用是完全開源的,閱讀源碼可以看到更多的技術細節實現,反而更直接有效。如果在使用過程中發現有bug,非常歡迎反饋,我會繼續維護這個項目。