我對(duì)Rxjava的理解

1遇到問(wèn)題:

我們?cè)谶^(guò)長(zhǎng)的時(shí)間里,習(xí)慣了以往事情一步步的處理,這里我講的一步步的處理,指的是一系列的事件分步進(jìn)行叽粹,比如有如下需求,進(jìn)入activity之后需要立馬進(jìn)行如下操作:

先獲取用戶列表》》界面顯示用戶列表

獲取每個(gè)用戶的詳細(xì)信息》》將列表item設(shè)置為可點(diǎn)擊

獲取每個(gè)用戶的頭像》》列表中的用戶頭像顯示出來(lái)

對(duì)于用戶的頭像進(jìn)行壓縮》》輸出壓縮成功日志到控制臺(tái)

將壓縮后的頭像存儲(chǔ)》》輸出保存成功日志到控制臺(tái)

很明顯却舀,這一系列的事件如果按照以往的子線程調(diào)度虫几,然后handler切換更新ui,必定會(huì)使代碼變得冗長(zhǎng)而那一閱讀禁筏,代碼的縮進(jìn)也將像進(jìn)入了地獄般持钉,有人會(huì)說(shuō),以上步驟可以通過(guò)服務(wù)器返回足夠恰當(dāng)?shù)臄?shù)據(jù)一步完成篱昔。其實(shí)這里僅僅做一個(gè)例子每强,況且有些情況,服務(wù)端人員并不能溝通到的州刽,比如你需要調(diào)用第三方服務(wù)的接口空执,他們不會(huì)為了讓你方便一些就去對(duì)他們整個(gè)架構(gòu)大動(dòng)干戈的;

2穗椅,問(wèn)題思考:

既然傳統(tǒng)的方式看起來(lái)很麻煩辨绊,那么有沒(méi)有解決方法?如果目前我們不知道有Rxjava這個(gè)東西匹表,讓我們自己去封裝一個(gè)處理類似需求的解決方案該怎么辦门坷?我會(huì)思考將所有的處理都放到一個(gè)線程中去,然后在每一步結(jié)束的時(shí)候通過(guò)handler更新ui袍镀,類似如下偽代碼:

new Thread(new Runnable() {

? ? @Override

? ? public void run() {

? ? ? ? //獲取用戶列表

? ? ? ? List users = getUserList();

? ? ? ? mHander.post(new Runnable() {

? ? ? ? ? ? @Override

? ? ? ? ? ? public void run() {

? ? ? ? ? ? ? ? //更新ui

? ? ? ? ? ? ? ? showUserList();

? ? ? ? ? ? }

? ? ? ? });

? ? ? ? //獲取每個(gè)用戶詳情

? ? ? ? List userDetails = new ArrayList<>();

? ? ? ? for (int i = 0; i < users.size(); i++) {

? ? ? ? ? ? UserDetail userDetail = getUserDetail(users.get(i).getId());

? ? ? ? ? ? userDetails.add(userDetail);

? ? ? ? ? ? final int finalI = i;

? ? ? ? ? ? mHander.post(new Runnable() {

? ? ? ? ? ? ? ? @Override

? ? ? ? ? ? ? ? public void run() {

? ? ? ? ? ? ? ? ? ? //更新ui

? ? ? ? ? ? ? ? ? ? updateListViewClickable(finalI);

? ? ? ? ? ? ? ? }

? ? ? ? ? ? });

? ? ? ? }

? ? ? ? //獲取每個(gè)用戶的頭像

? ? ? ? List bitmaps = new ArrayList<>();

? ? ? ? for (int i = 0; i < userDetails.size(); i++) {

? ? ? ? ? ? UserDetail userDetail = userDetails.get(i);

? ? ? ? ? ? final Bitmap bitmap = getUserThumb(userDetail);

? ? ? ? ? ? final int finalI = i;

? ? ? ? ? ? mHander.post(new Runnable() {

? ? ? ? ? ? ? ? @Override

? ? ? ? ? ? ? ? public void run() {

? ? ? ? ? ? ? ? ? ? //更新ui

? ? ? ? ? ? ? ? ? ? updateUserHeader(finalI, bitmap);

? ? ? ? ? ? ? ? }

? ? ? ? ? ? });

? ? ? ? }

? ? ? ? //壓縮圖片

? ? ? ? for (int i = 0; i < bitmaps.size(); i++) {

? ? ? ? ? ? Bitmap bitmap = bitmaps.get(i);

? ? ? ? ? ? final Bitmap cbitmap = compressBitmap(bitmap);

? ? ? ? }

? ? ? ? mHander.post(new Runnable() {

? ? ? ? ? ? @Override

? ? ? ? ? ? public void run() {

? ? ? ? ? ? ? ? //更新ui

? ? ? ? ? ? ? ? ToastUtils.showShort("壓縮圖片成功");

? ? ? ? ? ? }

? ? ? ? });

? ? ? ? //保存圖片

? ? ? ? for (int i = 0; i < bitmaps.size(); i++) {

? ? ? ? ? ? Bitmap bitmap = bitmaps.get(i);

? ? ? ? ? ? saveBitmap(bitmap);

? ? ? ? }

? ? ? ? mHander.post(new Runnable() {

? ? ? ? ? ? @Override

? ? ? ? ? ? public void run() {

? ? ? ? ? ? ? ? //更新ui

? ? ? ? ? ? ? ? ToastUtils.showShort("保存圖片成功");

? ? ? ? ? ? }

? ? ? ? });

? ? }

});

這樣做似乎還算簡(jiǎn)潔(其中有許多不合理的地方默蚌,比如圖片的一些列處理可以一個(gè)循環(huán)搞定,這里僅僅做一特例苇羡,不必深究)绸吸,也解決了地獄似得回調(diào),但似乎需要優(yōu)化的地方超級(jí)多:

?1设江,線程的創(chuàng)建與管理锦茁,代碼執(zhí)行線程的指定

?2,線程的切換

?3叉存,代碼編寫(xiě)麻煩

?4码俩,數(shù)據(jù)流處理很不完善

3,基于以上問(wèn)題的解決:

于是官方出品了自帶線程管理歼捏,線程切換稿存,鏈?zhǔn)阶兂晒话晟茢?shù)據(jù)操作符的Rxjava,如果帶著以上問(wèn)題再去審視Rxjava會(huì)好理解的多吧挠铲,那么我們?nèi)绻凑誖xjava的方式實(shí)現(xiàn)以上代碼是什么樣子的呢?偽代碼如下:

Observable.create(new ObservableOnSubscribe() {

? ? @Override

? ? public void subscribe(ObservableEmitter emitter) throws Exception {

? ? ? ? //獲取用戶列表

? ? ? ? List users = getUserList();

? ? ? ? emitter.onNext(users);

? ? ? ? //獲取每個(gè)用戶詳情

? ? ? ? List userDetails = new ArrayList<>();

? ? ? ? for (int i = 0; i < users.size(); i++) {

? ? ? ? ? ? UserDetail userDetail = getUserDetail(users.get(i).getId());

? ? ? ? ? ? userDetails.add(userDetail);

? ? ? ? ? ? emitter.onNext(i);

? ? ? ? }

? ? ? ? //獲取每個(gè)用戶的頭像

? ? ? ? List bitmaps = new ArrayList<>();

? ? ? ? for (int i = 0; i < userDetails.size(); i++) {

? ? ? ? ? ? UserDetail userDetail = userDetails.get(i);

? ? ? ? ? ? final Bitmap bitmap = getUserThumb(userDetail);

? ? ? ? ? ? emitter.onNext(bitmap);

? ? ? ? }

? ? ? ? //壓縮圖片

? ? ? ? for (int i = 0; i < bitmaps.size(); i++) {

? ? ? ? ? ? Bitmap bitmap = bitmaps.get(i);

? ? ? ? ? ? final Bitmap cbitmap = compressBitmap(bitmap);

? ? ? ? }

? ? ? ? emitter.onNext("壓縮圖片成功");

? ? ? ? //保存圖片

? ? ? ? for (int i = 0; i < bitmaps.size(); i++) {

? ? ? ? ? ? Bitmap bitmap = bitmaps.get(i);

? ? ? ? ? ? saveBitmap(bitmap);

? ? ? ? }

? ? ? ? emitter.onNext("保存圖片成功");

? ? }

}).subscribeOn(Schedulers.io())

? ? ? ? .observeOn(AndroidSchedulers.mainThread())

? ? ? ? .subscribe(new Consumer() {

? ? ? ? ? ? @Override

? ? ? ? ? ? public void accept(Object object) throws Exception {

? ? ? ? ? ? ? ? //Ui更新

? ? ? ? ? ? }

? ? ? ? });

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末寂诱,一起剝皮案震驚了整個(gè)濱河市拂苹,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌痰洒,老刑警劉巖瓢棒,帶你破解...
    沈念sama閱讀 217,509評(píng)論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異丘喻,居然都是意外死亡脯宿,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,806評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門泉粉,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)连霉,“玉大人,你說(shuō)我怎么就攤上這事嗡靡《搴常” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 163,875評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵讨彼,是天一觀的道長(zhǎng)歉井。 經(jīng)常有香客問(wèn)我,道長(zhǎng)哈误,這世上最難降的妖魔是什么哩至? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,441評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮蜜自,結(jié)果婚禮上菩貌,老公的妹妹穿的比我還像新娘。我一直安慰自己袁辈,他們只是感情好菜谣,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,488評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著晚缩,像睡著了一般尾膊。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上荞彼,一...
    開(kāi)封第一講書(shū)人閱讀 51,365評(píng)論 1 302
  • 那天冈敛,我揣著相機(jī)與錄音,去河邊找鬼鸣皂。 笑死抓谴,一個(gè)胖子當(dāng)著我的面吹牛暮蹂,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播癌压,決...
    沈念sama閱讀 40,190評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼仰泻,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了滩届?” 一聲冷哼從身側(cè)響起集侯,我...
    開(kāi)封第一講書(shū)人閱讀 39,062評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎帜消,沒(méi)想到半個(gè)月后棠枉,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,500評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡泡挺,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,706評(píng)論 3 335
  • 正文 我和宋清朗相戀三年辈讶,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片娄猫。...
    茶點(diǎn)故事閱讀 39,834評(píng)論 1 347
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡贱除,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出稚新,到底是詐尸還是另有隱情勘伺,我是刑警寧澤,帶...
    沈念sama閱讀 35,559評(píng)論 5 345
  • 正文 年R本政府宣布褂删,位于F島的核電站飞醉,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏屯阀。R本人自食惡果不足惜缅帘,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,167評(píng)論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望难衰。 院中可真熱鬧钦无,春花似錦、人聲如沸盖袭。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,779評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)鳄虱。三九已至弟塞,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間拙已,已是汗流浹背决记。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,912評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留倍踪,地道東北人系宫。 一個(gè)月前我還...
    沈念sama閱讀 47,958評(píng)論 2 370
  • 正文 我出身青樓索昂,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親扩借。 傳聞我的和親對(duì)象是個(gè)殘疾皇子椒惨,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,779評(píng)論 2 354

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

  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)潮罪,斷路器框产,智...
    卡卡羅2017閱讀 134,654評(píng)論 18 139
  • 前言我從去年開(kāi)始使用 RxJava ,到現(xiàn)在一年多了错洁。今年加入了 Flipboard 后,看到 Flipboard...
    占導(dǎo)zqq閱讀 9,164評(píng)論 6 151
  • 我從去年開(kāi)始使用 RxJava 戒突,到現(xiàn)在一年多了屯碴。今年加入了 Flipboard 后,看到 Flipboard 的...
    Jason_andy閱讀 5,472評(píng)論 7 62
  • 一、 和一個(gè)做心理咨詢師的朋友聊到感情問(wèn)題隔崎,她說(shuō): “對(duì)兩性關(guān)系來(lái)說(shuō)今艺,最具毀滅性的想法之一就是:如果我們需要努力,...
    羽扇清風(fēng)閱讀 724評(píng)論 0 1
  • 世界千百樣圖畫(huà)爵卒,但你我也只渴望回家虚缎。 ——鄧紫棋 《Victoria》 老喵誒: 歲月如流,算上生物學(xué)上對(duì)人...
    Sakura_Iceland閱讀 168評(píng)論 0 0