利用Rxjava簡單處理復(fù)雜請求

這是Android Weekly第270期推薦的一篇文章:How to make complex requests simple with RxJava in Kotlin,Kotlin寫的粱檀,MVP+Dagger2+RxJava2+Retrofit2陌宿,現(xiàn)在的標(biāo)配氢架。下載下來發(fā)現(xiàn)作者是用Android Studio 3.0寫的,改build.gradle中的gradle版本也跑不起來抄肖,也不想下載beta版的AS脖含,就想著自己試著寫一個,順便練習(xí)下角骤。MVP和Dagger2其實挺煩人的隅忿,所以我就怎么簡單怎么寫,達到目的就行了邦尊,還是用的Kotlin寫的(如果你說你不會kotlin背桐,那么建議趕緊學(xué)學(xué),說不定以后大牛的Demo都看不懂蝉揍,多難過傲辞汀),下面分析又沾。最后上代碼弊仪,有興趣的可以看看。

先看效果圖

screen
screen

這個Demo主要用的StackOverflow的開放API杖刷,就2個頁面励饵,第一個界面是請求了reputation最高的用戶并展示,第二個頁面是選擇了該用戶滑燃,展示其提的問題役听,給別人回答的答案,最喜歡的問題這三個部分表窘,每個部分只顯示3條典予。

煩人的就是第二個頁面了,該頁面是由4個接口返回的值組成的蚊丐,其中g(shù)etQuestions和getFavorites可以直接獲取到熙参,但是getAnswers返回的是答案,我們還要通過答案中的question_id再去請求對應(yīng)的問題來展示麦备。

一般的做法就是一個一個請求,再寫個方法組成沒問題,但是用RxJava中的flatmap和zip操作符能夠更加輕松的完成凛篙。

首先考慮用Single,對于Single黍匾,官網(wǎng)是這樣解釋的:

A Single is something like an Observable, but instead of emitting a series of values — anywhere from none at all to an infinite number — it always either emits one value or an error notification.

區(qū)別于Observable不同的是,Observable發(fā)出0~n個事件呛梆,而single只發(fā)出一個(事件)值:成功的值或者失敗的提示锐涯,我們就關(guān)心這2樣,相比較Observable的onNext,onComplete,onError稍微簡單些填物。

Single.zip(
                ApiHelper.getService().getQuestionsByUser(mUserId),
                getAnswers(),
                ApiHelper.getService().getFavoritesByUser(mUserId),
                Function3<CommonResult<Question>, List<Question>, CommonResult<Question>, DetailModel>
                { questionResult, answers, favoritesResult ->
                    val questions = questionResult.items.take(3)
                    val favorites = favoritesResult.items.take(3)
                    DetailModel(questions, answers, favorites)
                }
        ).subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe({
                    adapter.setData(it)
                }, {
                    it.printStackTrace()
                    toast("請求錯誤:${it.message}")
                })

zip的作用是將前三個Single發(fā)射的東西整合成一個再發(fā)射出去纹腌,看Function3,比如上面是將Single<Questions>,Single<Answers>,Single<Favorites>合成Single<DetailModel>返回滞磺,便于后續(xù)處理升薯。

getAnswers返回Single<List<Question>>,說到flatmap就想到和map的區(qū)別击困,map是將一個值轉(zhuǎn)化為另一個值涎劈,但是flatmap是將一個值轉(zhuǎn)化為一個新的Observable或者Single,再發(fā)出去阅茶,相當(dāng)于解決嵌套的問題蛛枚。下面有個注意點,用questionId去請求問題接口的話脸哀,如果把多個questionId放一起蹦浦,用;隔開去請求就會得到一個多個問題的數(shù)組返回

private fun getAnswers(): Single<List<Question>> {
        return ApiHelper.getService()
                .getAnswersByUser(mUserId)
                .flatMap {
                    val processedAnswers = it.items
                            .filter { it.accept }
                            .take(3)

                    val ids = processedAnswers
                            .map { it.questionId.toString() }
                            .joinToString(separator = ";")

                    ApiHelper.getService()
                            .getQuestionById(ids)
                            .map { it.items }
                }
    }

最后上自己寫的代碼地址:GitHub Repository,主要核心還是上面的zip和flatmap的使用撞蜂。代碼寫的還有很多不足的地方白筹,歡迎提出。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末谅摄,一起剝皮案震驚了整個濱河市徒河,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌送漠,老刑警劉巖顽照,帶你破解...
    沈念sama閱讀 206,602評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異闽寡,居然都是意外死亡代兵,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,442評論 2 382
  • 文/潘曉璐 我一進店門爷狈,熙熙樓的掌柜王于貴愁眉苦臉地迎上來植影,“玉大人,你說我怎么就攤上這事涎永∷急遥” “怎么了鹿响?”我有些...
    開封第一講書人閱讀 152,878評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長谷饿。 經(jīng)常有香客問我惶我,道長,這世上最難降的妖魔是什么博投? 我笑而不...
    開封第一講書人閱讀 55,306評論 1 279
  • 正文 為了忘掉前任绸贡,我火速辦了婚禮,結(jié)果婚禮上毅哗,老公的妹妹穿的比我還像新娘听怕。我一直安慰自己,他們只是感情好虑绵,可當(dāng)我...
    茶點故事閱讀 64,330評論 5 373
  • 文/花漫 我一把揭開白布尿瞭。 她就那樣靜靜地躺著,像睡著了一般蒸殿。 火紅的嫁衣襯著肌膚如雪筷厘。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,071評論 1 285
  • 那天宏所,我揣著相機與錄音酥艳,去河邊找鬼。 笑死爬骤,一個胖子當(dāng)著我的面吹牛充石,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播霞玄,決...
    沈念sama閱讀 38,382評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼骤铃,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了坷剧?” 一聲冷哼從身側(cè)響起惰爬,我...
    開封第一講書人閱讀 37,006評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎惫企,沒想到半個月后撕瞧,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,512評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡狞尔,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,965評論 2 325
  • 正文 我和宋清朗相戀三年丛版,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片偏序。...
    茶點故事閱讀 38,094評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡页畦,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出研儒,到底是詐尸還是另有隱情豫缨,我是刑警寧澤独令,帶...
    沈念sama閱讀 33,732評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站州胳,受9級特大地震影響记焊,放射性物質(zhì)發(fā)生泄漏逸月。R本人自食惡果不足惜栓撞,卻給世界環(huán)境...
    茶點故事閱讀 39,283評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望碗硬。 院中可真熱鬧瓤湘,春花似錦、人聲如沸恩尾。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,286評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽翰意。三九已至木人,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間冀偶,已是汗流浹背醒第。 一陣腳步聲響...
    開封第一講書人閱讀 31,512評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留进鸠,地道東北人稠曼。 一個月前我還...
    沈念sama閱讀 45,536評論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像客年,于是被迫代替她去往敵國和親霞幅。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,828評論 2 345

推薦閱讀更多精彩內(nèi)容

  • 原文地址:https://blog.mindorks.com/how-to-make-complex-reques...
    南若水閱讀 6,200評論 0 4
  • 本篇文章介主要紹RxJava中操作符是以函數(shù)作為基本單位量瓜,與響應(yīng)式編程作為結(jié)合使用的司恳,對什么是操作、操作符都有哪些...
    嘎啦果安卓獸閱讀 2,837評論 0 10
  • 作者: maplejaw本篇只解析標(biāo)準包中的操作符绍傲。對于擴展包扔傅,由于使用率較低,如有需求唧取,請讀者自行查閱文檔铅鲤。 創(chuàng)...
    maplejaw_閱讀 45,600評論 8 93
  • RxJava技術(shù)分享 京金所—時光 2016.9.22 這里我拿出來給 Android 開發(fā)者的 RxJava 詳...
    JC_Mobile閱讀 5,562評論 3 55
  • 太陽不再那么吝嗇,微弱的陽光靜靜的撒在樓宇之間枫弟,瑟瑟的空氣微微發(fā)暖邢享。深秋的季節(jié),一切仿似沒有任何的變化淡诗,正常的作...
    零余閱讀 321評論 4 1