RxJava+Retrofit在項目中的實際應用----《妹紙》開源項目源碼解析(一)

一,前言

知識儲備:
1,基本會使用RxJava,Retrofit
2,會Lambda常見表達式

二,meizhi開源項目介紹

1,github上star客觀,這意味著什么呢?star數(shù)越多,我理解的是我們程序員對這個項目認可度更高,與此同時,當然其中值得我學習的內容就更多,學習難度也是遞增的.

meizhi.png

2,項目結構層次清晰,其中的代碼封裝性很好,看了其中的代碼有一種美感.
3,值得學習的東西:
RxJava+Retrofit的較為巧妙的用法;
如何使用Lambda表達式;
android新特性,如:recylerView的使用(重點在于點擊事件是如何處理的),activity轉場,android原生的下拉刷新等等

項目概況:


s0.png

s7.jpg

三,進入正題

首先得讓大家感受一下鋪面而來的RxJava之美

/**
 * 獲取服務數(shù)據(jù)
 *
 * @param clean 清除來自數(shù)據(jù)庫緩存或者已有數(shù)據(jù)。
 */
private void loadData(boolean clean) {
    mLastVideoIndex = 0;
    // @formatter:off
    Subscription s = Observable
           .zip(sGankIO.getMeizhiData(mPage),
                 sGankIO.get休息視頻Data(mPage),
                 this::createMeizhiDataWith休息視頻Desc)
           .map(meizhiData -> meizhiData.results)
           .flatMap(Observable::from)
           .toSortedList((meizhi1, meizhi2) ->
                 meizhi2.publishedAt.compareTo(meizhi1.publishedAt))
           .doOnNext(this::saveMeizhis)
           .observeOn(AndroidSchedulers.mainThread())
           .finallyDo(() -> setRefresh(false))
           .subscribe(meizhis -> {
               if (clean) mMeizhiList.clear();
               mMeizhiList.addAll(meizhis);
               mMeizhiListAdapter.notifyDataSetChanged();
               setRefresh(false);
           }, throwable -> loadError(throwable));
    addSubscription(s);
}

這段代碼是meizhi首頁獲取以及加載網(wǎng)絡數(shù)據(jù)的代碼.

1,我的感嘆 當我第一次看到這段代碼的時候有種慚愧的感覺,我也用RxJava,Retrofit,怎么別人用的時候能這么有美感,這么簡潔.
2,其中的技術含量:Rxjava的各種操作符:zip(),map(),flatMap(),排序操作符toSortedList(),順序操作符doOnNext(),finallyDo(),以及Subcription與activity,fragment生命周期的綁定.
a,zip()分析:
應用場景:同時發(fā)送兩個請求,等這兩個響應數(shù)據(jù)都準備好再展示數(shù)據(jù).
要是自己去實現(xiàn),那真是蛋疼;RxJava的zip簡直是福音.
b,map,flatMap這兩個操作符是變換數(shù)據(jù)結構的意思,其中的區(qū)別在于前者只是變換數(shù)據(jù)結構,后者是新生成Observable,通常可以與from操作符配合使用.
c,toSortedList((meizhi1, meizhi2)將前后兩個Observable進行排序,我推測其中應該是使用了冒泡排序實現(xiàn)的.
d,doOnNext(),finallyDo(),前者是允許我們在每次輸出一個元素之前做一些額外的事情,即在Observable在subscribe(訂閱)之前的最后操作,后者finallyDo會在Observable結束后觸發(fā)回調管行,無論是正常還是異常終止.(這里的操作是setRefresh(false),意思就是說這兩個請求匯集成一個無論是成功還是失敗都會停止刷新.)
e,addSubscription(s)
添加到CompositeSubscription中,
CompositeSubscription中含有Set<Subscription> subscriptions,
CompositeSubscription維護著Subscription集合,以
方便Subcription的取消訂閱操作,與activity或者fragment生命周期綁定.

/**
 * 獲取服務數(shù)據(jù)
 *
 * @param clean 清除來自數(shù)據(jù)庫緩存或者已有數(shù)據(jù)。
 */
private void loadData(boolean clean) {
    mLastVideoIndex = 0;
    // @formatter:off
    Subscription s = Observable
            /**
             * zip:同時發(fā)兩個請求,等兩個請求完畢后匯合成另外一個數(shù)據(jù)集
             */
            .zip(sGankIO.getMeizhiData(mPage),
                    sGankIO.get休息視頻Data(mPage),
                    this::createMeizhiDataWith休息視頻Desc)
            /**
             * 轉變數(shù)據(jù)集合結構
             */
            .map(meizhiData -> meizhiData.results)
            /**
             * 依次發(fā)射Observable
             * 方便下面的排序
             */
            .flatMap(Observable::from)//ClassName::staticMethod lamda表達式的方法引用
            /**
             * 根據(jù)發(fā)布時間降序排列
             */
            .toSortedList((meizhi1, meizhi2) ->
                    meizhi2.publishedAt.compareTo(meizhi1.publishedAt))
            /**
             *在被訂閱前的操作
             * 保存數(shù)據(jù)到本地
             */
            .doOnNext(this::saveMeizhis)//objectName::instanceMethod lamda表達式的方法引用
            .observeOn(AndroidSchedulers.mainThread())
            /**
             * to be invoked when the source Observable finishes
             */
            .finallyDo(() -> setRefresh(false))
            .subscribe(meizhis -> {
                if (clean) mMeizhiList.clear();
                mMeizhiList.addAll(meizhis);
                mMeizhiListAdapter.notifyDataSetChanged();
                setRefresh(false);
            }, throwable -> loadError(throwable));
    // @formatter:on
    /**
     * 添加到CompositeSubscription中,CompositeSubscription中含有Set<Subscription> subscriptions
     * CompositeSubscription維護了Subscription集合.
     * 方便Subcription的取消訂閱操作.與activity或者fragment生命周期綁定.
     */
    addSubscription(s);
}

最后我直接fork該項目添加了一些幫助閱讀源碼的注釋,之后仍會持續(xù)更新,各位看官感興趣的不妨star一下~
meizhi源碼解析GitHub地址
我的github地址:
我的開源項目
歡迎fork,star~

my.png
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末钝腺,一起剝皮案震驚了整個濱河市躏啰,隨后出現(xiàn)的幾起案子婶博,更是在濱河造成了極大的恐慌雹拄,老刑警劉巖收奔,帶你破解...
    沈念sama閱讀 221,576評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異滓玖,居然都是意外死亡筹淫,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,515評論 3 399
  • 文/潘曉璐 我一進店門呢撞,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人饰剥,你說我怎么就攤上這事殊霞。” “怎么了汰蓉?”我有些...
    開封第一講書人閱讀 168,017評論 0 360
  • 文/不壞的土叔 我叫張陵绷蹲,是天一觀的道長。 經常有香客問我顾孽,道長祝钢,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,626評論 1 296
  • 正文 為了忘掉前任若厚,我火速辦了婚禮拦英,結果婚禮上,老公的妹妹穿的比我還像新娘测秸。我一直安慰自己疤估,他們只是感情好,可當我...
    茶點故事閱讀 68,625評論 6 397
  • 文/花漫 我一把揭開白布霎冯。 她就那樣靜靜地躺著铃拇,像睡著了一般。 火紅的嫁衣襯著肌膚如雪沈撞。 梳的紋絲不亂的頭發(fā)上慷荔,一...
    開封第一講書人閱讀 52,255評論 1 308
  • 那天,我揣著相機與錄音缠俺,去河邊找鬼显晶。 笑死贷岸,一個胖子當著我的面吹牛,可吹牛的內容都是我干的吧碾。 我是一名探鬼主播凰盔,決...
    沈念sama閱讀 40,825評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼倦春!你這毒婦竟也來了户敬?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,729評論 0 276
  • 序言:老撾萬榮一對情侶失蹤睁本,失蹤者是張志新(化名)和其女友劉穎尿庐,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體呢堰,經...
    沈念sama閱讀 46,271評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡抄瑟,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,363評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了枉疼。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片皮假。...
    茶點故事閱讀 40,498評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖骂维,靈堂內的尸體忽然破棺而出惹资,到底是詐尸還是另有隱情,我是刑警寧澤航闺,帶...
    沈念sama閱讀 36,183評論 5 350
  • 正文 年R本政府宣布褪测,位于F島的核電站,受9級特大地震影響潦刃,放射性物質發(fā)生泄漏侮措。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,867評論 3 333
  • 文/蒙蒙 一乖杠、第九天 我趴在偏房一處隱蔽的房頂上張望分扎。 院中可真熱鬧,春花似錦胧洒、人聲如沸笆包。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,338評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽庵佣。三九已至,卻和暖如春汛兜,著一層夾襖步出監(jiān)牢的瞬間巴粪,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,458評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留肛根,地道東北人辫塌。 一個月前我還...
    沈念sama閱讀 48,906評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像派哲,于是被迫代替她去往敵國和親臼氨。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,507評論 2 359

推薦閱讀更多精彩內容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,283評論 25 707
  • 本篇文章介主要紹RxJava中操作符是以函數(shù)作為基本單位芭届,與響應式編程作為結合使用的储矩,對什么是操作、操作符都有哪些...
    嘎啦果安卓獸閱讀 2,866評論 0 10
  • 響應式編程簡介 響應式編程是一種基于異步數(shù)據(jù)流概念的編程模式褂乍。數(shù)據(jù)流就像一條河:它可以被觀測持隧,被過濾,被操作逃片,或者...
    說碼解字閱讀 3,074評論 0 5
  • 近乎逃離的小城褥实,卻成為如今的思念呀狼。來到這里,會時常仰望天空损离,想起安妮寶貝的那句話:當一個女子仰望天空時哥艇,她并不是在...
    雨季不再來echo閱讀 170評論 0 0
  • 哎呀, 這個世界上的高人真是太多了草冈,只有你想不到的事情,沒有別人做不同的事情瓮增。他們現(xiàn)在做的事情我曾經也做過怎棱,只不過...
    嗨嗨皮皮的閱讀 603評論 0 0