[轉(zhuǎn)載]RxJava使用場(chǎng)景

原文鏈接 http://blog.csdn.net/theone10211024/article/details/50435325

一、Scheduler線程切換

這種場(chǎng)景經(jīng)常會(huì)在“后臺(tái)線程取數(shù)據(jù)包斑,主線程展示”的模式中看見

[html]view plaincopy

Observable.just(1,?2,?3,?4)

.subscribeOn(Schedulers.io())?//?指定?subscribe()?發(fā)生在?IO?線程

.observeOn(AndroidSchedulers.mainThread())?//?指定?Subscriber?的回調(diào)發(fā)生在主線程

.subscribe(new?Action1()?{

@Override

public?void?call(Integer?number)?{

Log.d(tag,?"number:"?+?number);

}

});

二、使用debounce做textSearch

用簡(jiǎn)單的話講就是當(dāng)N個(gè)結(jié)點(diǎn)發(fā)生的時(shí)間太靠近(即發(fā)生的時(shí)間差小于設(shè)定的值T)捶枢,debounce就會(huì)自動(dòng)過濾掉前N-1個(gè)結(jié)點(diǎn)浑侥。

比如在做百度地址聯(lián)想的時(shí)候尖淘,可以使用debounce減少頻繁的網(wǎng)絡(luò)請(qǐng)求昌阿。避免每輸入(刪除)一個(gè)字就做一次聯(lián)想

[html]view plaincopy

RxTextView.textChangeEvents(inputEditText)

.debounce(400,?TimeUnit.MILLISECONDS)

.observeOn(AndroidSchedulers.mainThread())

.subscribe(new?Observer()?{

@Override

public?void?onCompleted()?{

log.d("onComplete");

}

@Override

public?void?onError(Throwable?e)?{

log.d("Error");

}

@Override

public?void?onNext(TextViewTextChangeEvent?onTextChangeEvent)?{

log.d(format("Searching?for?%s",?onTextChangeEvent.text().toString()));

}

});

三殖告、Retrofit結(jié)合RxJava做網(wǎng)絡(luò)請(qǐng)求框架

這里不作詳解烘挫,具體的介紹可以看扔物線的這篇文章诀艰,對(duì)RxJava的入門者有很大的啟發(fā)。其中也講到了RxJava和Retrofit如何結(jié)合來實(shí)現(xiàn)更簡(jiǎn)潔的代碼

四饮六、RxJava代替EventBus進(jìn)行數(shù)據(jù)傳遞:RxBus

注意:RxBus并不是一個(gè)庫(kù)其垄,而是一種模式,是使用了RxJava的思想來達(dá)到EventBus的數(shù)據(jù)傳遞效果卤橄。這篇文章把RxBus講的比較詳細(xì)绿满。

五、使用combineLatest合并最近N個(gè)結(jié)點(diǎn)

例如:注冊(cè)的時(shí)候所有輸入信息(郵箱窟扑、密碼喇颁、電話號(hào)碼等)合法才點(diǎn)亮注冊(cè)按鈕。

[html]view plaincopy

Observable_emailChangeObservable=RxTextView.textChanges(_email).skip(1);

Observable_passwordChangeObservable=RxTextView.textChanges(_password).skip(1);

Observable_numberChangeObservable=RxTextView.textChanges(_number).skip(1);

Observable.combineLatest(_emailChangeObservable,

_passwordChangeObservable,

_numberChangeObservable,

new?Func3()?{

@Override

public?Boolean?call(CharSequence?newEmail,

CharSequence?newPassword,

CharSequence?newNumber)?{

Log.d("xiayong",newEmail+"?"+newPassword+"?"+newNumber);

booleanemailValid=?!isEmpty(newEmail)?&&

EMAIL_ADDRESS.matcher(newEmail).matches();

if?(!emailValid)?{

_email.setError("Invalid?Email!");

}

booleanpassValid=?!isEmpty(newPassword)?&&?newPassword.length()>8;

if?(!passValid)?{

_password.setError("Invalid?Password!");

}

booleannumValid=?!isEmpty(newNumber);

if?(numValid)?{

intnum=Integer.parseInt(newNumber.toString());

numValid=num>0?&&?num<=?100;

}

if?(!numValid)?{

_number.setError("Invalid?Number!");

}

return?emailValid?&&?passValid?&&?numValid;

}

})//

.subscribe(new?Observer()?{

@Override

public?void?onCompleted()?{

log.d("completed");

}

@Override

public?void?onError(Throwable?e)?{

log.d("Error");

}

@Override

public?void?onNext(Boolean?formValid)?{

_btnValidIndicator.setEnabled(formValid);

}

});

六嚎货、使用merge合并兩個(gè)數(shù)據(jù)源橘霎。

例如一組數(shù)據(jù)來自網(wǎng)絡(luò),一組數(shù)據(jù)來自文件殖属,需要合并兩組數(shù)據(jù)一起展示姐叁。

[html]view plaincopy

Observable.merge(getDataFromFile(),?getDataFromNet())

.observeOn(AndroidSchedulers.mainThread())

.subscribe(new?Subscriber()?{

@Override

public?void?onCompleted()?{

log.d("done?loading?all?data");

}

@Override

public?void?onError(Throwable?e)?{

log.d("error");

}

@Override

public?void?onNext(String?data)?{

log.d("all?merged?data?will?pass?here?one?by?one!")

});

七、使用concat和first做緩存

依次檢查memory洗显、disk和network中是否存在數(shù)據(jù)外潜,任何一步一旦發(fā)現(xiàn)數(shù)據(jù)后面的操作都不執(zhí)行。

[html]view plaincopy

Observablememory=Observable.create(new?Observable.OnSubscribe()?{

@Override

public?void?call(Subscribersubscriber)?{

if?(memoryCache?!=?null)?{

subscriber.onNext(memoryCache);

}?else?{

subscriber.onCompleted();

}

}

});

Observabledisk=Observable.create(new?Observable.OnSubscribe()?{

@Override

public?void?call(Subscribersubscriber)?{

StringcachePref=rxPreferences.getString("cache").get();

if?(!TextUtils.isEmpty(cachePref))?{

subscriber.onNext(cachePref);

}?else?{

subscriber.onCompleted();

}

}

});

Observablenetwork=Observable.just("network");

//依次檢查memory墙懂、disk橡卤、network

Observable.concat(memory,?disk,?network)

.first()

.subscribeOn(Schedulers.newThread())

.subscribe(s?->{

memoryCache="memory";

System.out.println("--------------subscribe:?"?+?s);

});

八、使用timer做定時(shí)操作损搬。當(dāng)有“x秒后執(zhí)行y操作”類似的需求的時(shí)候碧库,想到使用timer

例如:2秒后輸出日志“hello world”,然后結(jié)束巧勤。

[html]view plaincopy

Observable.timer(2,?TimeUnit.SECONDS)

.subscribe(new?Observer()?{

@Override

public?void?onCompleted()?{

log.d?("completed");

}

@Override

public?void?onError(Throwable?e)?{

log.e("error");

}

@Override

public?void?onNext(Long?number)?{

log.d?("hello?world");

}

});

九嵌灰、使用interval做周期性操作。當(dāng)有“每隔xx秒后執(zhí)行yy操作”類似的需求的時(shí)候颅悉,想到使用interval

例如:每隔2秒輸出日志“helloworld”沽瞭。

[html]view plaincopy

Observable.interval(2,?TimeUnit.SECONDS)

.subscribe(new?Observer()?{

@Override

public?void?onCompleted()?{

log.d?("completed");

}

@Override

public?void?onError(Throwable?e)?{

log.e("error");

}

@Override

public?void?onNext(Long?number)?{

log.d?("hello?world");

}

});

十、使用throttleFirst防止按鈕重復(fù)點(diǎn)擊

ps:debounce也能達(dá)到同樣的效果

[html]view plaincopy

RxView.clicks(button)

.throttleFirst(1,?TimeUnit.SECONDS)

.subscribe(new?Observer()?{

@Override

public?void?onCompleted()?{

log.d?("completed");

}

@Override

public?void?onError(Throwable?e)?{

log.e("error");

}

@Override

public?void?onNext(Object?o)?{

log.d("button?clicked");

}

});

十一剩瓶、使用schedulePeriodically做輪詢請(qǐng)求

[html]view plaincopy

Observable.create(new?Observable.OnSubscribe()?{

@Override

public?void?call(final?Subscriberobserver)?{

Schedulers.newThread().createWorker()

.schedulePeriodically(new?Action0()?{

@Override

public?void?call()?{

observer.onNext(doNetworkCallAndGetStringResult());

}

},?INITIAL_DELAY,?POLLING_INTERVAL,?TimeUnit.MILLISECONDS);

}

}).subscribe(new?Action1()?{

@Override

public?void?call(String?s)?{

log.d("polling….”));

}

})

十二驹溃、RxJava進(jìn)行數(shù)組城丧、list的遍歷

[html]view plaincopy

String[]names=?{"Tom",?"Lily",?"Alisa",?"Sheldon",?"Bill"};

Observable

.from(names)

.subscribe(new?Action1()?{

@Override

public?void?call(String?name)?{

log.d(name);

}

});

十三、解決嵌套回調(diào)(callback hell)問題

[html]view plaincopy

NetworkService.getToken("username",?"password")

.flatMap(s?->NetworkService.getMessage(s))

.subscribe(s?->{

System.out.println("message:?"?+?s);

})

十四豌鹤、響應(yīng)式的界面

比如勾選了某個(gè)checkbox亡哄,自動(dòng)更新對(duì)應(yīng)的preference

[html]view plaincopy

SharedPreferencespreferences=PreferenceManager.getDefaultSharedPreferences(this);

RxSharedPreferencesrxPreferences=RxSharedPreferences.create(preferences);

Preferencechecked=rxPreferences.getBoolean("checked",?true);

CheckBoxcheckBox=?(CheckBox)?findViewById(R.id.cb_test);

RxCompoundButton.checkedChanges(checkBox)

.subscribe(checked.asAction());

最后,由于個(gè)人能力有限布疙,文章難免有疏漏之處蚊惯,如果您有任何疑議,請(qǐng)讓我知道灵临,謝謝截型!本文所有的例子已經(jīng)上傳到github上

致謝:這篇文章的絕大多數(shù)例子是從這里總結(jié)的,還有部分例子來自這里儒溉。對(duì)作者的無私貢獻(xiàn)表示感謝宦焦!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市顿涣,隨后出現(xiàn)的幾起案子赶诊,更是在濱河造成了極大的恐慌,老刑警劉巖园骆,帶你破解...
    沈念sama閱讀 221,635評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異寓调,居然都是意外死亡锌唾,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,543評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門夺英,熙熙樓的掌柜王于貴愁眉苦臉地迎上來晌涕,“玉大人,你說我怎么就攤上這事痛悯∮嗬瑁” “怎么了?”我有些...
    開封第一講書人閱讀 168,083評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵载萌,是天一觀的道長(zhǎng)惧财。 經(jīng)常有香客問我,道長(zhǎng)扭仁,這世上最難降的妖魔是什么垮衷? 我笑而不...
    開封第一講書人閱讀 59,640評(píng)論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮乖坠,結(jié)果婚禮上搀突,老公的妹妹穿的比我還像新娘。我一直安慰自己熊泵,他們只是感情好仰迁,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,640評(píng)論 6 397
  • 文/花漫 我一把揭開白布甸昏。 她就那樣靜靜地躺著,像睡著了一般徐许。 火紅的嫁衣襯著肌膚如雪施蜜。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,262評(píng)論 1 308
  • 那天绊寻,我揣著相機(jī)與錄音花墩,去河邊找鬼。 笑死澄步,一個(gè)胖子當(dāng)著我的面吹牛冰蘑,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播村缸,決...
    沈念sama閱讀 40,833評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼祠肥,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了梯皿?” 一聲冷哼從身側(cè)響起仇箱,我...
    開封第一講書人閱讀 39,736評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎东羹,沒想到半個(gè)月后剂桥,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,280評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡属提,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,369評(píng)論 3 340
  • 正文 我和宋清朗相戀三年权逗,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片冤议。...
    茶點(diǎn)故事閱讀 40,503評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡斟薇,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出恕酸,到底是詐尸還是另有隱情堪滨,我是刑警寧澤,帶...
    沈念sama閱讀 36,185評(píng)論 5 350
  • 正文 年R本政府宣布蕊温,位于F島的核電站袱箱,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏义矛。R本人自食惡果不足惜犯眠,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,870評(píng)論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望症革。 院中可真熱鬧筐咧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,340評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至残炮,卻和暖如春韭赘,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背势就。 一陣腳步聲響...
    開封第一講書人閱讀 33,460評(píng)論 1 272
  • 我被黑心中介騙來泰國(guó)打工泉瞻, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人苞冯。 一個(gè)月前我還...
    沈念sama閱讀 48,909評(píng)論 3 376
  • 正文 我出身青樓袖牙,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親舅锄。 傳聞我的和親對(duì)象是個(gè)殘疾皇子鞭达,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,512評(píng)論 2 359

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