一篇RxJava友好的文章(一)
轉(zhuǎn)載請(qǐng)標(biāo)明出處:
http://blog.csdn.net/forezp/article/details/52886700
本文出自方志朋的博客
Rxjava在目前的開發(fā)中已經(jīng)是如火如荼,非常的流行,唯一的就是上手不太容易,學(xué)習(xí)成本高,學(xué)習(xí)rxjava有一段時(shí)間了,也看了老羅的rxjava視頻,決定自己總結(jié)下。
另外歡迎star我的另一個(gè)項(xiàng)目,瓣呀,一個(gè)基于豆瓣API模仿網(wǎng)易云音樂的開源app
準(zhǔn)備
在android工程中的gradle.build中配置,為了更好的理解,所以導(dǎo)入java8 的lambda 表達(dá)式。
compile 'io.reactivex:rxjava:1.2.1' compile 'io.reactivex:rxandroid:1.2.1'基礎(chǔ)
rxjava 中有兩個(gè)核心的對(duì)象Observable(被觀察者,它會(huì)發(fā)出一系列的事件源)和Subscribers(觀察者,接受事件源),Observable發(fā)出事件后,中間可以有一系列的操作、變化,可以精確的控制事件,最終被觀察者所接收。其中Observable每發(fā)出一個(gè)事件就會(huì),就會(huì)調(diào)用他的subscriber 的onext(),直到發(fā)生錯(cuò)誤onerror()或onComplete()結(jié)束。
1.用Observable.create去創(chuàng)建一個(gè)Observable對(duì)象,并發(fā)射一個(gè)”hi Rxjava”,就結(jié)束。
Observable<String> observable= Observable.create(new Observable.OnSubscribe<String>() { @Override public void call(Subscriber<? super String> subscriber){ subscriber.onNext("hi RxJava"); subscriber.onCompleted(); }});然后,我們需要去創(chuàng)建一個(gè)subscriber去處理observable發(fā)射過(guò)來(lái)的數(shù)據(jù)。
Subscriber<String> subscriber=new Subscriber<String>() {@Override public void onCompleted() { Log.e(TAG,"onCompleted"); } @Override public void onError(Throwable e) { Log.e(TAG,e.getMessage()); } @Overridepublic void onNext(String s) { Log.e(TAG,s); }};最后需要,subscribe函數(shù)把observable對(duì)象和subscriber對(duì)象關(guān)聯(lián)起來(lái),這樣就完成了subscriber對(duì)observable的訂閱。
observable.subscribe(subscriber);程序運(yùn)行一下:
可能你覺得這樣太復(fù)雜了,但是涉及到了與之前不一樣的變成思想,即響應(yīng)式編程。
2.用just去創(chuàng)建observable,just英語(yǔ)意思是僅僅的意思,如果只發(fā)出一個(gè)事件可以用這種方式。另外在創(chuàng)建Subscriber的時(shí)候,如果僅僅關(guān)心onNext(),這時(shí)可以用Action1這個(gè)對(duì)象。
Observable.just("hi Rxjava2").subscribe(new Action1<String>() { @Override public void call(String s) { Log.e(TAG,s); }});運(yùn)行程序:
3.用from創(chuàng)建observable,這種方式創(chuàng)建,需要傳入一個(gè)集合,它會(huì)一個(gè)一個(gè)的發(fā)射,在subscriber上它會(huì)一個(gè)一個(gè)的接收。
String [] strs={"1","2","3","4"}; Observable.from(Arrays.asList(strs)) .subscribe(new Action1<String>() { @Override public void call(String s) { Log.e(TAG,s); }});運(yùn)行程序:
是不是有點(diǎn)像高級(jí)for循環(huán)-.- 。
4.操作符map,是用在observable和subcriber中間,是為了操作observable發(fā)射的數(shù)據(jù),操作之后的數(shù)據(jù),會(huì)被subcriber 接收。rxjava有很多操作符,map操作符是將一個(gè)事件轉(zhuǎn)換為另一個(gè)事件的。
Observable.just("hi rxjava") .map(new Func1<String, String>() { @Override public String call(String s) { return s+" ,你好rxjava"; }}) .subscribe(new Action1<String>() { @Override public void call(String s) { Log.e(TAG,s); }});運(yùn)行程序:
另外,map操作符可以將轉(zhuǎn)換類型,比如string 轉(zhuǎn)int .
Observable.just("hi rxjava") .map(new Func1<String, Integer>() { @Override public Integer call(String s) { return s.hashCode(); }}) .subscribe(new Action1<Object>() { @Override public void call(Object s) { Log.e(TAG,s+""); }});5.flatmap操作符
flatMap操作符接收一個(gè)Observable的輸出作為輸入,同時(shí)輸出另外一個(gè)Observable。在flatMap操作符中,我們可以做一系列的事情,然后輸出的新的Observable,這個(gè)Observable是我們?cè)赟ubscriber想要接收的。
首先Observable發(fā)出一個(gè)list , 然后經(jīng)過(guò)flatmap 將其變成from創(chuàng)建的Observable,這個(gè)Observable將list中的元素一個(gè)一個(gè)的發(fā)射,然后,subcriber 中接收。
運(yùn)行程序:
6.filter 操作符,對(duì)Observable發(fā)射的數(shù)據(jù)進(jìn)行過(guò)濾操作,哪有subcriber接收 ,哪些不接收。
Observable.create(new Observable.OnSubscribe<List<String>>() { @Override public void call(Subscriber<? super List<String>> subscriber) { String [] strs={"1","2","3","4","5","6","7"}; subscriber.onNext(Arrays.asList(strs)); }}) .flatMap(new Func1<List<String>, Observable<?>>() { @Override public Observable<?> call(List<String> list) { return Observable.from(list); }}) .filter(new Func1<Object, Boolean>() {//filter 操作符,去掉“1”; @Override public Boolean call(Object o) { if(o.toString().equals("1"))return false; return true; }}) .subscribe(new Action1<Object>() {@Override public void call(Object o) { Log.e(TAG,o.toString()); }});運(yùn)行程序:
7.take操作符,固定返回?cái)?shù)量。take(2),返回2個(gè)結(jié)果。
Observable.create(new Observable.OnSubscribe<List<String>>() { @Override public void call(Subscriber<? super List<String>> subscriber) { String [] strs={"1","2","3","4","5","6","7"}; subscriber.onNext(Arrays.asList(strs)); }}) .flatMap(new Func1<List<String>, Observable<?>>() { @Override public Observable<?> call(List<String> list) { return Observable.from(list); }}) .filter(new Func1<Object, Boolean>() {//filter 操作符,去掉“1”; @Override public Boolean call(Object o) { if(o.toString().equals("1"))return false; return true; }}) .take(2) .subscribe(new Action1<Object>() {//take 操作符,最多輸出的數(shù)量 @Override public void call(Object o) { Log.e(TAG,o.toString()); }});運(yùn)行程序:
rxjava中還有很多操作符,具體見官網(wǎng)文檔和中文文檔,操作符可以讓你對(duì)數(shù)據(jù)流做任何操作。多個(gè)操作符配合起來(lái),可以讓很復(fù)雜的邏輯變得簡(jiǎn)單,同時(shí),在操作數(shù)據(jù)的過(guò)程中,subcriber并不需要知道中間做了那些操作,只需要知道返回的結(jié)果,操作數(shù)據(jù)也變的簡(jiǎn)單。
源碼下載
優(yōu)秀文章推薦:
- 史上最簡(jiǎn)單的 SpringCloud 教程 | 終章
- 史上最簡(jiǎn)單的 SpringCloud 教程 | 第一篇: 服務(wù)的注冊(cè)與發(fā)現(xiàn)(Eureka)
- 史上最簡(jiǎn)單的SpringCloud教程 | 第七篇: 高可用的分布式配置中心(Spring Cloud Config)
轉(zhuǎn)載于:https://www.cnblogs.com/forezp/p/9852195.html
《新程序員》:云原生和全面數(shù)字化實(shí)踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀總結(jié)
以上是生活随笔為你收集整理的一篇RxJava友好的文章(一)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: js - 02课
- 下一篇: Django【进阶篇 】