RxJava操作符(1)-创建

Create

Create是最基本的Creating Observables操作符,使用Create操作符创建一个Observables,在合适的时机调用Subscriber的onNext/onComplete/onError方法。需要注意的是Observables有且只能调用onComplete/onError一次,并且一旦调用,其它方法将不再执行。Subscriber的onNext方法是将处理好的数据发送给Subscriber;onComplete方法是告知Subscriber需要发送的数据已发送完毕;onError方法是在发送数据的过程中,产生了错误,发送一个Throwable对象给Subscriber。

原理图如下:


首先声明一个订阅者代码如下:

    mSubscriber = new Subscriber<T>() {
        @Override
        public void onCompleted() {
            displayLogcat("onCompleted");
        }

        @Override
        public void onError(Throwable e) {
            displayLogcat("onError e is " + e);
        }

        @Override
        public void onNext(T t) {
            displayLogcat("onNext T is " + t);
        }
    };

打印的log信息的方法如下:

    protected void displayLogcat(String message) {
        if (mLogcatView != null) {
            String text = mLogcatView.getText().toString();
            mLogcatView.setText(text + "\n" + message);
        }
    }

Create操作符的使用如下:

    @Override
    protected void createObservable() {
        super.createObservable();
        mObservable = Observable.create(new Observable.OnSubscribe<Integer>() {
            @Override
            public void call(Subscriber<? super Integer> subscriber) {
                if (!subscriber.isUnsubscribed()) {
                    subscriber.onNext(1);
                    subscriber.onNext(2);
                    subscriber.onNext(3);
                    subscriber.onError(new Throwable("create error"));
                    subscriber.onCompleted();
                    subscriber.onNext(4);
                }
            }
        });
    }

点击按钮run会执行如下代码:

    mObservable.subscribe(mSubscriber);//订阅

点击按钮cancel会执行如下代码:

    mSubscriber.unsubscribe();//取消订阅
分别不注释掉onError方法和注释掉onError方法,运行代码,结果如下:

上图中next=4并没有打印出来,可见Observables有且只能调用onComplete/onError一次,并且一旦调用,其它方法将不再执行。

Range

Range是一个发射特定整数序列的Observable的操作符,Range操作符根据出初始值n和m发射一系列大于等于n的m个值。

原理图如下:


订阅、log信息、订阅、取消订阅的相关代码跟Create操作符中的一样,后面不在提示。

Range操作符的使用如下:

    @Override
    protected void createObservable() {
        super.createObservable();
        mObservable = Observable.range(0, 10);
    }
运行代码,结果如下:

Defer

Defer操作符只有在Subscriber被订阅时,才会创建一个新的Observables,也就是说,Defer操作符能够保证每次发射的数据都是最新的。

原理图如下:


Defer操作符的使用如下:

    @Override
    protected void createObservable() {
        super.createObservable();
        mObservable = Observable.defer(new Func0<Observable<Long>>() {
            @Override
            public Observable call() {
                return Observable.just(System.currentTimeMillis());
            }
        });
    }
运行代码,结果如下:
从上图可以看出,每次点击run的时候,打印的时间点都不是一样的,这里也验证了defer操作符是在Subscriber被订阅时,创建的Observables。

Just

Just操作符是将某个对象转换为Observable,并将这个Observable发射出去,其中某个对象可为数字、字符串、数组、Iterate对象。并且每次发射的Observable是最初创建的Observable。

原理图如下:


Just操作符的使用如下:

    @Override
    protected void createObservable() {
        super.createObservable();
        mObservable = Observable.just(System.currentTimeMillis());
    }
运行代码,结果如下:

从上图可以看出,每次点击run的时候,打印的时间点都是一样的,说明每次发射的Observable,都是最开始创建的Observable,后面的订阅过程中没有重新创建新的Observable.

From

From操作符是将某个对象转换为Observable,并将对象的数据挨个发射出去,其中某个对象可为Future、Iterable和数组。跟Just操作符比较类似,只是Just操作符是一次性把数据发射出去,而From操作符是挨个将对象里的数据发射出去,例如含有5个字符串的数组,使用Just的操作符会一次性将数组发射出去,使用From操作符会发射5次,每次下发一个字符串。

原理图如下:


From操作符的使用如下:

    @Override
    protected void createObservable() {
        super.createObservable();
        initData();
//        mObservable = Observable.from(array);
        mObservable = Observable.from(list);
    }

    private void initData() {
        for (int i = 0; i < 5; i++) {
            String string = "item" + i;
            array[i] = string;
            list.add(string);
        }
    }
运行代码,结果如下:

Interval

Interval操作符类似与一个从零开始的计时器,每隔一个固定的时间,发射一个整型的数据出来,需要注意的是Interval操作符是运行在computation Scheduler,如果需要在view中显示发射出来的结果,要在主线程中订阅,调用observeOn(AndroidSchedulers.mainThread())。

原理图如下:


Interval操作符的使用如下:

    @Override
    protected void createObservable() {
        super.createObservable();
        mObservable = Observable.interval(1, TimeUnit.SECONDS)
                .observeOn(AndroidSchedulers.mainThread());
    }
运行代码,结果如下:

Repeat

Repeat操作符是将一个Observable重复发送n次,n是传入repeat的参数。

原理图如下:


Repeat操作符的使用如下:

    @Override
    protected void createObservable() {
        super.createObservable();
        mObservable = Observable.just(System.currentTimeMillis()).repeat(5);
    }
运行代码,结果如下:

Timer

Timer操作符类似于一个倒计时装置,等倒计时完成之后,发射一个数字0。

原理图如下:


Timer操作符使用如下:

    @Override
    protected void createObservable() {
        super.createObservable();
        mObservable = Observable.timer(5, TimeUnit.SECONDS)
                .observeOn(AndroidSchedulers.mainThread());
    }
运行代码,结果如下:



接下来就是鸣谢了,非常感谢以下两位博主,相关链接如下:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值