Android框架第(三)篇--響應(yīng)式編程

版權(quán)聲明:本文為小斑馬偉原創(chuàng)文章,轉(zhuǎn)載請(qǐng)注明出處!

RxJava響應(yīng)式編程

上篇簡(jiǎn)單的闡述了響應(yīng)式編程的基本理論。這篇主要對(duì)響應(yīng)編程進(jìn)行詳細(xì)的介紹。以及主要介紹響應(yīng)編程的主要實(shí)現(xiàn)-RxJava。其中RxJava的操作符和調(diào)度器(Scheduler)主要介紹對(duì)象。

一、什么是響應(yīng)式編程?

響應(yīng)式編程:是一種基于異步數(shù)據(jù)流概念的編程模式。關(guān)鍵概念:事件 把現(xiàn)實(shí)中的事件, 搬到軟件中區(qū)去, 事件過程等待 觸發(fā)到另一種事件。響應(yīng)式編程最通用的一個(gè)場(chǎng)景是UI:我們的移動(dòng)App必須做出對(duì)網(wǎng)絡(luò)調(diào)用、用戶觸摸輸入和系統(tǒng)彈框的響應(yīng)。RxJava是響應(yīng)式編程的具體實(shí)現(xiàn),是異步數(shù)據(jù)處理庫 擴(kuò)展的觀察者模式。

二、擴(kuò)展觀察者模式

擴(kuò)展的觀察者模式:有四個(gè)基本的要素:Observable (被觀察者)、 Observer (觀察者)、 subscribe (訂閱)、event(事件)。Observable (被觀察者)和 Observer (觀察者)通過 subscribe() 方法實(shí)現(xiàn)訂閱關(guān)系,Observable就可以在需要的時(shí)候通知Observer。其中onCompleted、onError、onNext是必須要實(shí)現(xiàn)的方法,他們的含義分別是:

  • 1.onCompleted:事件隊(duì)列完結(jié),RxJava 不僅把每個(gè)事件單獨(dú)處理,還會(huì)把它們看做一個(gè)隊(duì)列。當(dāng)不會(huì)再有新的 onNext發(fā)出時(shí),需要觸發(fā) onCompleted() 方法作為完成標(biāo)志。
  • 2.onError:事件隊(duì)列異常,在事件處理過程中出異常時(shí),onError() 會(huì)被觸發(fā),同時(shí)隊(duì)列自動(dòng)終止,不允許再有事件發(fā)出。
  • 3.onNext:普通的事件,將要處理的事件添加到事件隊(duì)列中。
  • 4.onStart:它會(huì)在事件還未發(fā)送之前被調(diào)用,可以用于做一些準(zhǔn)備工作。例如數(shù)據(jù)的清零或重置,這是一個(gè)可選方法,默認(rèn)情況下它的實(shí)現(xiàn)為空。
三、基本概念

RxJava的四個(gè)基本角色:Observable、Observer、Subscriber、Subject。Observable和Subject是兩個(gè)“生產(chǎn)”實(shí)體,Observer和Subscriber是兩個(gè)“消費(fèi)”實(shí)體。RxJava本質(zhì)上是Rx是一個(gè)函數(shù)庫,讓開發(fā)者可以利用可觀察序列和LINQ風(fēng)格查詢操作符來編寫異步和基于事件的程序,開發(fā)者可以用Observables表示異步數(shù)據(jù)流,用LINQ操作符查詢異步數(shù)據(jù)流, 用Schedulers參數(shù)化異步數(shù)據(jù)流的并發(fā)處理,Rx可以這樣定義:Rx = Observables + LINQ + Schedulers。

四、RxJava操作符的分類
操作符的分類
1.Creating ObServables(創(chuàng)建Observable)
2.Transforming Observables(轉(zhuǎn)換Observabl)
3.Filtering Observables(過濾Observable)
4.Combing Observables(組合Observable)
5.Error Handling Operators(處理錯(cuò)誤)
4.1Creating ObServables(創(chuàng)建Observable)
Create Just From
Defer Empty/Never/Throw Interval
Range Repeat Start
Timer *** ***
  • 1.原始的創(chuàng)建:Observable.create()

    private static void create() {  //一個(gè)原始的創(chuàng)建
      Observable.create(new OnSubscribe<String>(){
    
          @Override
          public void call(Subscriber<? super String> subscriber) {
              subscriber.onNext("RxJava學(xué)習(xí)");
          }
      }).subscribe(new Subscriber<String>(){
    
          @Override
          public void onCompleted() {
              System.out.println("onCompleted()");
          }
    
          @Override
          public void onError(Throwable arg0) {
              System.out.println("onError()");
          }
    
          @Override
          public void onNext(String arg0) {
              System.out.println("onNext():"+arg0);
          }
          
      });
    }
    
  • 2.Observable.just() 方法可以傳入一到九個(gè)參數(shù),它們會(huì)按照傳入的參數(shù)的順序來發(fā)射它們。 just() 方法也可以接受列表或數(shù)組,

    private static void just() {//對(duì)create的簡(jiǎn)寫 快捷鍵
      Observable.just("sdgsagsag").subscribe(new Subscriber<String>(){
    
          @Override
          public void onCompleted() {
              System.out.println("onCompleted()");
              
          }
    
          @Override
          public void onError(Throwable arg0) {
              // TODO Auto-generated method stub
              
          }
    
          @Override
          public void onNext(String arg0) {
              System.out.println("onNext():"+arg0);
              
          }
      });
     }
    
  • 3.Observable.from() 創(chuàng)建符可以從一個(gè)列表/數(shù)組來創(chuàng)建Observable,并一個(gè)接一個(gè)的從列表/數(shù)組中發(fā)射出來每一個(gè)對(duì)象,或者也可以從Java Future 類來創(chuàng)建Observable,并發(fā)射Future對(duì)象的 .get() 方法返回的結(jié)果值。傳入 Future 作為參數(shù)時(shí),我們可以指定一個(gè)超時(shí)的值。Observable將等待來自 Future 的結(jié)果;如果在超時(shí)之前仍然沒有結(jié)果返回,Observable將會(huì)觸發(fā) onError() 方法通知觀察者有錯(cuò)誤發(fā)生了。

private static void from() {  //創(chuàng)建一個(gè)數(shù)組和列表轉(zhuǎn)換成其他數(shù)據(jù)類型的對(duì)象 和數(shù)據(jù)類型
     ArrayList<Integer> items = new ArrayList<Integer>();
     items.add(1);
     items.add(2);
     items.add(3);
     items.add(5);
     items.add(6);
     items.add(7);
     Observable.from(items).subscribe(new Subscriber<Integer>(){

       @Override
       public void onCompleted() {
          System.out.println("onCompleted()");
            
      }

      @Override
      public void onError(Throwable arg0) {
          // TODO Auto-generated method stub
            
      }

      @Override
      public void onNext(Integer arg0) {
          System.out.println("onNext():"+arg0);
            
      }     
    });
}
  • 4.Observable.defer()對(duì)象后賦值 也能輸出來

    private static String valuestr;
    private static void defer() {//Observable對(duì)象后賦值 也能輸出來
      ArrayList<Integer> items = new ArrayList<Integer>();
      items.add(1);
      items.add(2);
      items.add(3);
      items.add(4);
      items.add(5);
      items.add(6);
      items.add(7);
      Observable observable = Observable.defer(new Func0<Observable<String>>() {
    
          @Override
          public Observable<String> call() {
              return Observable.just(valuestr);
          }
      });
      
      valuestr = "速度更快sag凱撒";
      observable.subscribe(new Subscriber<String>(){
    
          @Override
          public void onCompleted() {
              System.out.println("onCompleted()");
              
          }
    
          @Override
          public void onError(Throwable arg0) {
              
          }
    
          @Override
          public void onNext(String arg0) {
              System.out.println("onNext():"+arg0);
              
          }
          
      });
    

    }

  • 5.Obervable.range()對(duì)象后賦值 也能輸出來

    private static void range() {//Observable對(duì)象后賦值 也能輸出來
      ArrayList<Integer> items = new ArrayList<Integer>();
      items.add(1);
      items.add(2);
      items.add(3);
      items.add(4);
      items.add(5);
      items.add(6);
      items.add(7);
      Observable observable = Observable.range(1, 5).repeat(4);
      
      observable.subscribe(new Subscriber<Integer>(){
    
          @Override
          public void onCompleted() {
              System.out.println("onCompleted()");
              
          }
    
          @Override
          public void onError(Throwable arg0) {
              
          }
    
          @Override
          public void onNext(Integer arg0) {
              System.out.println("onNext():"+arg0);
              
          }
        });
     }
    
4.2Transforming Observables(轉(zhuǎn)換Observable)
  • 1.Map:將一個(gè)對(duì)象轉(zhuǎn)換為我們?nèi)魏我粋€(gè)想要的對(duì)象

  • 2.FlatMap:Observable.flatMap()接收一個(gè)Observable的輸出作為輸入,同時(shí)輸出另外一個(gè)Observable 一個(gè)對(duì)象返回Observable對(duì)象 一對(duì)多

  • 3.GroupBy:通過一定的規(guī)則對(duì)數(shù)據(jù)列表進(jìn)行分組和歸類。

  • 4.Buffer:一次性把Observable數(shù)據(jù)對(duì)象發(fā)射到我們的觀察者

  • 5.Scan:把前面的數(shù)據(jù)進(jìn)行累加 發(fā)射到觀察者

    private static void testStranfrom() { //整形轉(zhuǎn)換成字符串
      Observable.just(123).map(new Func1<Integer, String>() {
    
          @Override
          public String call(Integer arg0) {
              // TODO Auto-generated method stub
              return arg0 +"";
          }
      }).subscribe(new Subscriber<String>(){
    
          @Override
          public void onCompleted() {
              System.out.println("onCompleted()");
          }
    
          @Override
          public void onError(Throwable arg0) {
              
          }
    
          @Override
          public void onNext(String arg0) {
              System.out.println("onNext():"+arg0);
          }
          
      });
    }
    
    private static void textflatmap() { 
      Observable.just(1,2,3,4,5,6).flatMap(new Func1<Integer, Observable<? extends String>>() {
    
          @Override
          public Observable<? extends String> call(Integer arg0) {
              // TODO Auto-generated method stub
              return Observable.just(arg0+"");
          }
      }).subscribe(new Subscriber<String>(){
    
          @Override
          public void onCompleted() {
              System.out.println("onCompleted()");
          }
    
          @Override
          public void onError(Throwable arg0) {
              
          }
    
          @Override
          public void onNext(String arg0) {
              System.out.println("onNext():"+arg0);
          }
          
      });
    }
    
    private static void groupby() { 
      Observable.just(1,2,3,4,5,6).groupBy(new Func1<Integer, Integer>() {
    
          @Override
          public Integer call(Integer arg0) {
              // TODO Auto-generated method stub
              return arg0 % 2; //分組的規(guī)則
          }
      }).subscribe(new Observer<GroupedObservable<Integer,Integer>>(){
    
          @Override
          public void onCompleted() {
              System.out.println("onCompleted()");
          }
    
          @Override
          public void onError(Throwable arg0) {
              
          }
    
          @Override
          public void onNext(final GroupedObservable<Integer, Integer> arg) {
              arg.subscribe(new Subscriber<Integer>(){
    
                  @Override
                  public void onCompleted() {
                      
                  }
    
                  @Override
                  public void onError(Throwable arg0) {
                      
                  }
    
                  @Override
                  public void onNext(Integer arg0) {
                      System.out.println("groupbt onNext():"+arg.getKey()+"data:"+arg0);
                  }
                  
              });
          }
      });
    }
    
    private static void buffer() { 
      Observable.range(1, 5).buffer(2).subscribe(new Observer<List<Integer>>(){
    
          @Override
          public void onCompleted() {
              
          }
    
          @Override
          public void onError(Throwable arg0) {
              
          }
    
          @Override
          public void onNext(List<Integer> arg0) {
              System.out.println("onNext:"+arg0);
          }
          
      });
    }
    
    private static void scan() { //每次據(jù)取兩個(gè)數(shù)據(jù)項(xiàng),然后向觀察者發(fā)射
      Observable.range(1, 5).scan(new Func2<Integer,Integer,Integer>(){
          @Override
          public Integer call(Integer sum, Integer arg1) {
              // TODO Auto-generated method stub
              return sum + arg1;
          }
      }).subscribe(new Observer<Integer>(){
    
          @Override
          public void onCompleted() {
              // TODO Auto-generated method stub
              
          }
    
          @Override
          public void onError(Throwable arg0) {
              // TODO Auto-generated method stub
              
          }
    
          @Override
          public void onNext(Integer arg0) {
              // TODO Auto-generatd method stube
              System.out.println("onNext:"+arg0);
          }
          
      });
    }
    
4.3Filtering Observables(過濾Observable)
  • 1.Debounce: 一定的時(shí)間內(nèi) 數(shù)據(jù)項(xiàng)后面沒有產(chǎn)生數(shù)據(jù) 將該數(shù)據(jù)發(fā)送出去

  • 2.Distinct:去掉重復(fù)的

  • 3.ElementAt:指定位置的數(shù)據(jù)

  • 4.Filter:按照我們指定的規(guī)則來進(jìn)行過濾 得道我們想要的數(shù)據(jù)

  • 5.First:取列表中的第一位數(shù)據(jù)

  • 6.IgnoreElements: 忽略列表上的所有元素 事件結(jié)束的時(shí)候回調(diào)Complement函數(shù)

  • 7.Last:我們指定的最后數(shù)位項(xiàng)數(shù)據(jù)

  • 8.Sample:對(duì)數(shù)據(jù)樣本數(shù)據(jù)的采集,采集后發(fā)射到觀察者 定時(shí)的取樣 取到的數(shù)據(jù)放到一個(gè)列表中 再發(fā)射。

  • 9.Skip:跳躍指定數(shù)據(jù)項(xiàng)的數(shù)據(jù) 然后取后面的數(shù)據(jù)

  • 10.SkipLast:跳過數(shù)據(jù)的后幾項(xiàng)

  • 11.Take:取值的意思 在數(shù)據(jù)列表中 如果只取數(shù)據(jù)項(xiàng)的前幾項(xiàng)

  • 12.TakeLast:取數(shù)據(jù)列表的最后幾項(xiàng)數(shù)據(jù) 指定的幾位數(shù)據(jù)

    private static void testDebounce() { //在一定的時(shí)間內(nèi) 數(shù)據(jù)項(xiàng)后面沒有產(chǎn)生數(shù)據(jù) 將該數(shù)據(jù)發(fā)送出去
      Observable.create(new OnSubscribe<Integer>() {
    
          @Override
          public void call(Subscriber<? super Integer> arg0) {
              for(int i = 0; i <10; i++) {
                  try {
                      Thread.sleep(1000);
                      arg0.onNext(1);
                  } catch (InterruptedException e) {
                      arg0.onError(e);
                  }
              }
          }
          
      }).debounce(1,TimeUnit.SECONDS).subscribe(new Subscriber<Integer>(){
    
          @Override
          public void onCompleted() {
              // TODO Auto-generated method stub
              System.out.println("onCompleted():" + "\n");
          }
    
          @Override
          public void onError(Throwable arg0) {
              // TODO Auto-generated method stub
              System.out.println("onError:" + arg0+  "\n");
          }
    
          @Override
          public void onNext(Integer arg0) {
              // TODO Auto-generated method stub
              System.out.println("onNext:" + arg0+  "\n");
          }
          
      });
    }
    
     private static void testDistinct() { //去掉重復(fù)的
      Observable.just(1, 2, 3, 3, 2).distinct().subscribe(new Subscriber<Integer>(){
    
          @Override
          public void onCompleted() {
              // TODO Auto-generated method stub
              System.out.println("onCompleted():" + "\n");
          }
    
          @Override
          public void onError(Throwable arg0) {
              // TODO Auto-generated method stub
              System.out.println("onError:" + arg0+  "\n");
          }
    
          @Override
          public void onNext(Integer arg0) {
              // TODO Auto-generated method stub
              System.out.println("onNext:" + arg0+  "\n");
          }
          
      });
    }
    
    private static void testElementAt() { //指定位置的數(shù)據(jù)
      Observable.just(1, 2, 2, 4).elementAt(2).subscribe(new Subscriber<Integer>(){
    
          @Override
          public void onCompleted() {
              System.out.println("onCompleted():" + "\n");
              
          }
    
          @Override
          public void onError(Throwable arg0) {
              System.out.println("onError:" + arg0+  "\n");
              
          }
    
          @Override
          public void onNext(Integer arg0) {
              System.out.println("onNext:" + arg0+  "\n");
          }
      });
    }
    private static void testFilter() { //去掉重復(fù)的 過濾
      Observable.just(1, 2, 3, 3, 2).distinct().filter(new Func1<Integer,Boolean>(){
          
          public Boolean call(Integer arg0) {
              return arg0 > 2;
          }
          
      }).subscribe(new Subscriber<Integer>(){
          @Override
          public void onCompleted() {
              // TODO Auto-generated method stub
              System.out.println("onCompleted():" + "\n");
          }
    
          @Override
          public void onError(Throwable arg0) {
              // TODO Auto-generated method stub
              System.out.println("onError:" + arg0+  "\n");
          }
    
          @Override
          public void onNext(Integer arg0) {
              // TODO Auto-generated method stub
              System.out.println("onNext:" + arg0+  "\n");
          }
          
      });
    }
    private static void testFirst() { //指定位置的數(shù)據(jù)
      Observable.just(1, 2, 2, 4).first().subscribe(new Subscriber<Integer>(){
    
          @Override
          public void onCompleted() {
              System.out.println("onCompleted():" + "\n");
              
          }
    
          @Override
          public void onError(Throwable arg0) {
              System.out.println("onError:" + arg0+  "\n");
              
          }
    
          @Override
          public void onNext(Integer arg0) {
              System.out.println("onNext:" + arg0+  "\n");
          }
      });
    }
    
    private static void testIgnoreElement() {
      Observable.create(new OnSubscribe<Integer>(){
    
          @Override
          public void call(Subscriber<? super Integer> arg0) {
              // TODO Auto-generated method stub
              arg0.onNext(233);
              //throw new NullPointerException();
              
          }
          
      }).ignoreElements().subscribe(new Subscriber<Integer>(){
    
          @Override
          public void onCompleted() {
              // TODO Auto-generated method stub
              System.out.println("onCompleted():" + "\n");
          }
    
          @Override
          public void onError(Throwable arg0) {
              // TODO Auto-generated method stub
              System.out.println("onError:" + arg0+  "\n");
          }
    
          @Override
          public void onNext(Integer arg0) {
              // TODO Auto-generated method stub
              System.out.println("onNext:" + arg0+  "\n");
          }
          
      });
    }
    
    private static void testSample() { //定時(shí)對(duì)數(shù)據(jù)進(jìn)行采樣  再發(fā)送出去
      Observable.create(new OnSubscribe<Integer>() {
    
          @Override
          public void call(Subscriber<? super Integer> arg0) {
              for(int i = 0; i <10; i++) {
                  try {
                      Thread.sleep(1000);
                      arg0.onNext(i);
                  } catch (InterruptedException e) {
                      arg0.onError(e);
                  }
              }
              arg0.onCompleted();
          }
          
      }).sample(1,TimeUnit.SECONDS).subscribe(new Subscriber<Integer>(){
    
          @Override
          public void onCompleted() {
              // TODO Auto-generated method stub
              System.out.println("onCompleted():" + "\n");
          }
    
          @Override
          public void onError(Throwable arg0) {
              // TODO Auto-generated method stub
              System.out.println("onError:" + arg0+  "\n");
          }
    
          @Override
          public void onNext(Integer arg0) {
              // TODO Auto-generated method stub
              System.out.println("onNext:" + arg0+  "\n");
          }
          
      });
    }
      private static void testSkip() { //跳過多少項(xiàng)目
      Observable.just(1, 2, 2, 4).skip(3).subscribe(new Subscriber<Integer>(){
    
          @Override
          public void onCompleted() {
              System.out.println("onCompleted():" + "\n");
              
          }
    
          @Override
          public void onError(Throwable arg0) {
              System.out.println("onError:" + arg0+  "\n");
              
          }
    
          @Override
          public void onNext(Integer arg0) {
              System.out.println("onNext:" + arg0+  "\n");
          }
      });
    }
    
    private static void testTake() { //取出多少項(xiàng)目
      Observable.just(1, 2, 2, 4).take(3).subscribe(new Subscriber<Integer>(){
    
          @Override
          public void onCompleted() {
              System.out.println("onCompleted():" + "\n");
              
          }
    
          @Override
          public void onError(Throwable arg0) {
              System.out.println("onError:" + arg0+  "\n");
              
          }
    
          @Override
          public void onNext(Integer arg0) {
              System.out.println("onNext:" + arg0+  "\n");
          }
      });
    }
    
4.3Combing Observables(組合Observable)
  • 1.Zip:在一段時(shí)間內(nèi)將最近的元素進(jìn)行組合在一起

  • 2.Merge: 按照時(shí)間先后順序 進(jìn)行組合

  • 3.StartWith: 在當(dāng)前的數(shù)據(jù)之前插入 我們想要的數(shù)據(jù) (數(shù)據(jù)類型或者Observable)

  • 4.CombineLatest: 最新接觸 組合數(shù)據(jù)

  • 5.Join:

  • 6.SwithchOnNext:后面的覆蓋前面的數(shù)據(jù)組合

      /**
     * 用來合并兩個(gè)Observable發(fā)射的數(shù)據(jù)項(xiàng),根據(jù)Func2函數(shù)生成一個(gè)新的值并發(fā)射出去。其中一個(gè)Observable發(fā)送數(shù)據(jù)結(jié)束或者出現(xiàn)異常后,
     * 另外一個(gè)Observable也將停在發(fā)射數(shù)據(jù)
     */
    private static void testZip() {
      Observable<Integer> observable1 = Observable.just(10, 20, 30);
      Observable<Integer> observable2 = Observable.just(4, 8, 12, 16);
      Observable.zip(observable1, observable2, new Func2<Integer,Integer,Integer>(){
    
          @Override
          public Integer call(Integer arg0, Integer arg1) {
              return arg0 + arg1;
          }
      }).subscribe(new Subscriber<Integer>(){
    
          @Override
          public void onCompleted() {
              System.out.println("onCompleted");
          }
    
          @Override
          public void onError(Throwable arg0) {
              System.out.println("onError():"+arg0.getMessage());
              
          }
    
          @Override
          public void onNext(Integer arg0) {
              System.out.println("onNext arg0 "+arg0);
          }
      });
    }
    
     /**
       * 將兩個(gè)Observable發(fā)射的事件序列組合合并成一個(gè)事件序列,就像是Observable發(fā)射的一樣。你可以簡(jiǎn)單的將它理解成兩個(gè)Observable合并成一個(gè)Observable對(duì)象
       * 
       */
    private static void testMerg() {
      Observable<Integer> observable1 = Observable.just(10, 20, 30);
      Observable<Integer> observable2 = Observable.just(4, 8, 12, 16);
      Observable.merge(observable1,observable2).subscribe(new Subscriber<Integer>(){
    
          @Override
          public void onCompleted() {
              System.out.println("onCompleted");
              
          }
    
          @Override
          public void onError(Throwable arg0) {
              System.out.println("onError():"+arg0.getMessage());
              
          }
    
          @Override
          public void onNext(Integer arg0) {
              System.out.println("onNext arg0 "+arg0);
              
          }
      });
    }
    
     /**
       * 用于在源Observable發(fā)射的數(shù)據(jù)前插入數(shù)據(jù).使用startWith(Interable<T>)我們還可以在源Observable發(fā)射的數(shù)據(jù)前插入Iterable
      */
    private static void testStartWith() {
      Observable<Integer> first = Observable.just(1, 3, 5);
      Observable<Integer> second = Observable.just(2, 4, 6);
      first.startWith(second).subscribe(new Subscriber<Integer>(){
    
          @Override
          public void onCompleted() {
              System.out.println("onCompleted");
              
          }
    
          @Override
          public void onError(Throwable arg0) {
              System.out.println("onError():"+arg0.getMessage());
              
          }
    
          @Override
          public void onNext(Integer arg0) {
              System.out.println("onNext arg0 "+arg0);
              
          }
      });
    }
    
    /**
      * 用于將兩個(gè)Observable最近發(fā)射的數(shù)據(jù)已經(jīng)Func2函數(shù)的規(guī)則進(jìn)展集合  5+2 5+4 5+6
      */
    private static void testCombineLatest() {
      Observable<Integer> first = Observable.just(1, 3, 5);
      Observable<Integer> second = Observable.just(2, 4, 6);
      first.combineLatest(first, second, new Func2<Integer,Integer,Integer>(){
    
          @Override
          public Integer call(Integer arg0, Integer arg1) {
              // TODO Auto-generated method stub
              return arg0 + arg1;
          }
      }).subscribe(new Subscriber<Integer>(){
    
          @Override
          public void onCompleted() {
              System.out.println("onCompleted");
          }
    
          @Override
          public void onError(Throwable arg0) {
              System.out.println("onError():"+arg0.getMessage());
              
          }
    
          @Override
          public void onNext(Integer arg0) {
              System.out.println("onNext arg0 "+arg0);
          }
      });
    }
    
    /**
      * join()函數(shù)基于時(shí)間窗口將兩個(gè)Observables發(fā)射的數(shù)據(jù)結(jié)合在一起,每個(gè)Observable在自己的時(shí)間窗口內(nèi)獨(dú)有有效的,都可以拿來組合
      */
    private static void testJoin() {
      Observable<Integer> first = Observable.just(1, 3, 5);
      Observable<Integer> second = Observable.create(new OnSubscribe<Integer>(){
    
          @Override
          public void call(Subscriber<? super Integer> arg0) {
              try{
                  for(int i = 0; i < 5; i++) {
                      arg0.onNext(i);
                  }
                  arg0.onCompleted();
              }catch(Exception e){
                  e.printStackTrace();
              }
          }
      });
    }
    
4.4 Error Handling Operators(處理錯(cuò)誤)

Catch:捕獲異常處理
**onErrorReturn: **遇見異常正常結(jié)束數(shù)據(jù)流
onErrorResumeNext:當(dāng)數(shù)據(jù)遇見異常,用正常數(shù)據(jù)代替錯(cuò)誤數(shù)據(jù)項(xiàng) 不可以捕獲到異常信息
onExceptionResumeNext:當(dāng)有異常的時(shí)候,可以用正確的數(shù)據(jù)流替換掉,并且和、可以捕獲到異常信息

五、Schedulers(調(diào)度器)種類

調(diào)度器(Scheduler)是RxJava以一種極其簡(jiǎn)單的方式解決多線程問題機(jī)制。
Schedulers(調(diào)度器)種類:
.io() I/O操作
.computation()計(jì)算 計(jì)算類型
.immediate() 這個(gè)調(diào)度器允許你立即在當(dāng)前線程執(zhí)行你指定的工作
.newThread() 建立一個(gè)新的線程 它為指定任務(wù)啟動(dòng)一個(gè)新的線程
.trampoline() 按照順序排隊(duì)處理的 調(diào)度器將會(huì)按序處理隊(duì)列,并運(yùn)行隊(duì)列中每一個(gè)任務(wù)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,238評(píng)論 6 531
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,430評(píng)論 3 415
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,134評(píng)論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,893評(píng)論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 71,653評(píng)論 6 408
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,136評(píng)論 1 323
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,212評(píng)論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,372評(píng)論 0 288
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,888評(píng)論 1 334
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 40,738評(píng)論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 42,939評(píng)論 1 369
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,482評(píng)論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,179評(píng)論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,588評(píng)論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,829評(píng)論 1 283
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 51,610評(píng)論 3 391
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 47,916評(píng)論 2 372

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