<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      安卓筆記俠

      專注安卓開發

      導航

      Rxjava學習(二操作符)

      操作符是為了解決對Observable對象的變換的問題,操作符用于在Observable和最終的Subscriber之間修改Observable發出的事件

      1.filter

        filter()操作符是可以對Observable流程的數據進行一層過濾處理,返回一個新的Observable,filter()返回為false的值將不會發出到Subscriber,我們來看下具體的代碼

       1 Observable.just("2", "3").filter(new Func1<String, Boolean>() {
       2         @Override
       3         public Boolean call(String s) {
       4             if ("2".equals(s)) {
       5                 return true;
       6             }
       7             //只發送"2"到Subscriber
       8             return false;
       9         }
      10     }).subscribe(new Action1<String>() {
      11         @Override
      12         public void call(String s) {
      13             Log.i(TAG, "call3: " + s);
      14         }
      15 });

      2.map  

      ①事件對象的直接變換;它是 RxJava最常用的變換;可以將Observable深入的對象1轉換為對象2發送給Subscriber。

      一個Observable對象上可以多次使用map操作符

       1  Observable.just("images/logo.png") // 輸入類型 String
       2      .map(new Func1<String, Bitmap>() {
       3          @Override
       4          public Bitmap call(String filePath) { // 參數類型 String
       5              return getBitmapFromPath(filePath); // 返回類型 Bitmap
       6          }
       7      }).subscribe(new Action1<Bitmap>() {
       8         @Override
       9         public void call(Bitmap bitmap) { // 將修改的結果傳到Subscriber中處理
      10             showBitmap(bitmap);
      11         }
      12      });

      ②用來把一個事件轉換為另一個事件。

      map()操作符就是用于變換Observable對象的,map操作符返回一個Observable對象,這樣就可以實現鏈式調用,在一個Observable對象上多次使用map操作符,最終將最簡潔的數據傳遞給Subscriber對象。

       

      特性:

       

      1. 它不必返回Observable對象返回的類型,你可以使用map操作符返回一個發出新的數據類型的observable對象。
      2. 可以對一個Observable多次使用map

       

      用一個例子來練習:

      //剛創建的Observable是String類型的
      Observable.just("Hellp Map Operator")
      .map(new Func1<String, Integer>() {
          @Override
          public Integer call(String s) {
              return 2015;//通過第一個map轉成Integer
          }
      }).map(new Func1<Integer, String>() {
          @Override
          public String call(Integer integer) {
              return String.valueOf(integer);//再通過第二個map轉成String
          }
      }).subscribe(new Action1<String>() {
          @Override
          public void call(String s) {
              System.out.println(s);
          }
      });

       

      3.flatMap

      flatMap() 也和 map() 相同,也是把傳入的參數轉化之后返回另一個對象;和 map() 不同的是, flatMap() 中返回的是個 Observable 對象,并且這個 Observable 對象并不是被直接發送到了 Subscriber 的回調方法中。

               flatMap() 的原理:

             1. 使用傳入的事件對象創建一個 Observable 對象;

             2. 并不發送這個 Observable, 而是將它激活,于是它開始發送事件;

             3. 每一個創建出來的 Observable 發送的事件,都被匯入同一個 Observable ,而這個 Observable 負責將這些事件統一交給 Subscriber 的回調方法。

             這三個步驟,把事件拆成了兩級,通過一組新創建的 Observable 將初始的對象『鋪平』之后通過統一路徑分發了下去。

             擴展:由于可以在嵌套的Observable 中添加異步代碼, flatMap() 也常用于嵌套的異步操作,例如嵌套的網絡請求。

       

      使用場景:

      有方法根據輸入的字符串返回一個List集合信息 Observable<List<String>> query(String text);
       假如不用flatMap()我們應該這樣寫:

       query("message")
            .subscribe(new Action1<List<String>>() {
                  @Override
                  public void call(List<String> mLists) {
                    
                    Observable.from(mLists)  
                     .subscribe(new Action1<String>() {
                      @Override
                      public void call(String message) {
                            log.i(TAG,message);           
                      }
                   });      
                }
            }); 

      使用flatMap()這樣寫:

      query("Hello, world!")  
          .flatMap(new Func1<List<String>, Observable<String>>() {  
              @Override  
              public Observable<String> call(List<String> urls) {  
                  return Observable.from(urls);  
              }  
          })  
          .subscribe(new Action1<String>() {
                      @Override
                      public void call(String message) {
                            log.i(TAG,message);           
                      }
         });

      4.From

      from()接收一個集合作為輸入,然后每次輸出一個元素給subscriber.

      1. from(Iterable<? extends T> iterable)
      2. from(T[] array)

      Demo

      List<String> s = Arrays.asList("Java", "Android", "Ruby", "Ios", "Swift");
      Observable.from(s).subscribe(new Action1<String>() {
          @Override
          public void call(String s) {
              System.out.println(s);
          }
      });

      Log:

      Java
      Android
      Ruby
      Ios
      Swift

       

       

      5.Do操作符

      Do操作符是在Observable的生命周期的各個階段加上一系列的回調監聽

       

      doOnEach --- Observable每發射一個數據的時候就會觸發這個回調,不僅包括onNext還包括onError和onCompleted。
      doOnNext --- 只有onNext的時候才會被觸發
      doOnError --- 只有onError發生的時候觸發回調
      doOnComplete --- 只有onComplete發生的時候觸發回調
      doOnSubscribe和DoOnUnSubscribe --- 在Subscriber進行訂閱和反訂閱的時候觸發回調

      doOnTerminate --- 在Observable結束前觸發回調,無論是正常還是異常終止
      finallyDo --- 在Observable結束后觸發回調,無論是正常還是異常終止

       1 Observable.just(1,2,3)
       2         .doOnEach(new Action1<Notification<? super Integer>>() {
       3             @Override
       4             public void call(Notification<? super Integer> notification) {
       5                 Log.d(TAG,"doOnEach send" + notification);
       6             }
       7         })
       8         .doOnNext(new Action1<Integer>() {
       9             @Override
      10             public void call(Integer integer) {
      11                 Log.d(TAG,"doOnNext send" + integer);
      12             }
      13         })
      14         .doOnCompleted(new Action0() {
      15             @Override
      16             public void call() {
      17                 Log.d(TAG,"onCompleted");
      18             }
      19         })
      20         .doOnSubscribe(new Action0() {
      21             @Override
      22             public void call() {
      23                 Log.d(TAG,"onSubscribe");
      24             }
      25         })
      26         .doOnUnsubscribe(new Action0() {
      27             @Override
      28             public void call() {
      29                 Log.d(TAG,"onUnSubscribe");
      30             }
      31         })
      32         .subscribe(new Action1<Integer>() {
      33             @Override
      34             public void call(Integer integer) {
      35                 Log.d(TAG,"do:" + integer);
      36             }
      37         });

       

      posted on 2018-03-16 20:26  安卓筆記俠  閱讀(727)  評論(1)    收藏  舉報

      主站蜘蛛池模板: 婷婷五月综合丁香在线| 国产区精品福利在线观看精品| 成年女人午夜毛片免费视频 | 国内精品自在拍精选| 亚洲乱妇老熟女爽到高潮的片| 亚洲欧美中文日韩V在线观看| 亚洲成人高清av在线| 久久国内精品自在自线91| 亚洲第一精品一二三区| 极品美女扒开粉嫩小泬图片| 岛国av无码免费无禁网站| 欧美和黑人xxxx猛交视频| 少妇高潮毛片免费看| 久久综合给合久久狠狠狠88| 少妇激情av一区二区三区| 亚洲色欲色欲大片www无码| 九九热在线精品免费视频| 亚洲va久久久噜噜噜久久狠狠 | 22222se男人的天堂| 日韩中文字幕高清有码| 亚洲精品国自产拍影院| 爱性久久久久久久久| 国产熟女丝袜av一二区| 最新精品露脸国产在线| 国产熟睡乱子伦午夜视频| 日韩中文字幕有码av| 宝应县| 人妻熟女一二三区夜夜爱| 狠狠色噜噜狠狠亚洲AV| 客服| 欧美牲交a欧美牲交aⅴ免费真| 青青青视频免费一区二区| 亚洲午夜伦费影视在线观看| 美国又粗又长久久性黄大片| 乱60一70归性欧老妇| 图片区小说区av区| 欧美成本人视频免费播放| 97久久综合亚洲色hezyo| 日韩免费无码视频一区二区三区| 国产成人亚洲综合| 性做久久久久久久久|