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