RxJava之旅

RxJava——创建型操作符

2017-04-14  本文已影响28人  王小贱_ww

RxJava操作符分类很多,这篇文章讲一下创建型操作符。
1.Create
create操作符是所有创建型操作符的“根”,也就是说其他创建型操作符最后都是通过create操作符来创建Observable的,其流程图例如下:


create.png
示例代码:

Observable.create(new Observable.OnSubscribe<Integer>() {
    @Override
    public void call(Subscriber<? super Integer> observer) {
        try {
            if (!observer.isUnsubscribed()) {
                for (int i = 1; i < 5; i++) {
                    observer.onNext(i);
                }
                observer.onCompleted();
            }
        } catch (Exception e) {
            observer.onError(e);
        }
    }
 } ).subscribe(new Subscriber<Integer>() {
        @Override
        public void onNext(Integer item) {
            System.out.println("Next: " + item);
        }

        @Override
        public void onError(Throwable error) {
            System.err.println("Error: " + error.getMessage());
        }

        @Override
        public void onCompleted() {
            System.out.println("onCompleted.");
        }
    });
运行结果如下: 

Next: 1 
Next: 2 
Next: 3 
Next: 4 
onCompleted.

 在使用create操作符时,最好要在回调的call函数中增加isUnsubscribed的判断,以便在subscriber在取消订阅时不会再执行call函数中相关代码逻辑,从而避免导致一些意想不到的错误出现;

2.From
from操作符是把其他类型的对象和数据类型转化成Observable,其流程图例如下:

from_c.png
示例代码:

Integer[] items = { 0, 1, 2, 3, 4, 5 };
Observable myObservable = Observable.from(items);

myObservable.subscribe(
    new Action1<Integer>() {
        @Override
        public void call(Integer item) {
            System.out.println(item);
        }
    },
    new Action1<Throwable>() {
        @Override
        public void call(Throwable error) {
            System.out.println("Error encountered: " + error.getMessage());
        }
    },
    new Action0() {
        @Override
        public void call() {
            System.out.println("onCompleted");
        }
    }
);
运行结果如下: 

0 
1 
2 
3 
4 
5 
onCompleted 

3.Just
just操作符也是把其他类型的对象和数据类型转化成Observable,它和from操作符很像,只是方法的参数有所差别,其流程图例如下:

just_c.png
示例代码:

Observable.just(1, 2, 3)
          .subscribe(new Subscriber<Integer>() {
        @Override
        public void onNext(Integer integer) {
            System.out.println("Next: " + integer);
        }

        @Override
        public void onError(Throwable error) {
            System.err.println("Error: " + error.getMessage());
        }

        @Override
        public void onCompleted() {
            System.out.println("onCompleted");
        }
    });
运行结果如下: 

Next: 1 
Next: 2 
Next: 3 
onCompleted

4.Defer
defer操作符是直到有订阅者订阅时,才通过Observable的工厂方法创建Observable并执行,defer操作符能够保证Observable的状态是最新的,其流程实例如下:

defer_c.png
下面通过比较defer操作符和just操作符的运行结果作比较:

int i=10;
Observable justObservable = Observable.just(i);
i=12;
Observable deferObservable = Observable.defer(new Func0<Observable<Object>>() {
       @Override
       public Observable<Object> call() {
           return Observable.just(i);
       }
   });
  i=15;

  justObservable.subscribe(new Subscriber() {
      @Override
      public void onCompleted() {

      }

      @Override
      public void onError(Throwable e) {

      }

      @Override
      public void onNext(Object o) {
          System.out.println("just result:" + o.toString());
      }
  });

  deferObservable.subscribe(new Subscriber() {
      @Override
      public void onCompleted() {

      }

      @Override
      public void onError(Throwable e) {

      }

      @Override
      public void onNext(Object o) {
          System.out.println("defer result:" + o.toString());
      }
  });   
运行结果如下: 

just result:10 
defer result:15
可以看到,just操作符是在创建Observable就进行了赋值操作,而defer是在订阅者订阅时才创建Observable,此时才进行真正的赋值操作。

5.Interval

interval.png
示例代码:
//以秒为单位,每隔1秒发射一个数据
        Observable.interval(1, TimeUnit.SECONDS)
        .subscribe(new Subscriber<Long>() {
            @Override
            public void onCompleted() {
                System.out.println("onCompleted" );
            }
            @Override
            public void onError(Throwable e) {
            }
            @Override
            public void onNext(Long aLong) {
                System.out.println("interval:" + aLong);
            }
        });
运行结果如下:

interval:0
interval:1
interval:2
interval:3
......

6.Range

示例代码:

Observable.range(1, 6).subscribe(new Subscriber<Integer>() {
            @Override
            public void onNext(Integer item) {
                System.out.println("Next: " + item); 
            }
            @Override
            public void onError(Throwable error) {
            }
            @Override
            public void onCompleted() {
                System.out.println("onCompleted"); 
            }
        });
运行结果如下:

Next: 1
Next: 2
Next: 3
Next: 4
Next: 5
Next: 6
onCompleted

7.Repeat

repeat.png
示例代码:

//重复5次发送数据1
Observable.just(1).repeat(5).subscribe(new Subscriber<Integer>() {
    @Override
    public void onNext(Integer item) {
        System.out.println("Next: " + item); 
    }
    @Override
    public void onError(Throwable error) {
        System.err.println("Error: " + error.getMessage());
    }
    @Override
    public void onCompleted() {
        System.out.println("onCompleted"); 
    }
});
运行结果如下:

Next: 1
Next: 1
Next: 1
Next: 1
Next: 1
onCompleted

8.Timer


timer.png
示例代码:

SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss");
        String beginTime = sdf.format(new Date());
        System.out.println("beginTime : " + beginTime); 
        Observable.timer(2, TimeUnit.SECONDS)//从0开始发射数据
        .subscribe(new Subscriber<Long>() {
            @Override
            public void onNext(Long item) {
                //2秒后发射了一个数据
                System.out.println("Next: " + item); 
                String endTime =  sdf.format(new Date());
                System.out.println("endTime :" + endTime); 
            }
            @Override
            public void onError(Throwable error) {
                System.err.println("Error: " + error.getMessage());
            }
            @Override
            public void onCompleted() {
                System.out.println("onCompleted"); 
            }
        });
运行结果如下:

beginTime : 16:15:12
Next: 0
endTime :16:15:14
onCompleted

上一篇 下一篇

猜你喜欢

热点阅读