Quantcast
Channel: CSDN博客移动开发推荐文章
Viewing all articles
Browse latest Browse all 5930

深入浅出RxJava2.0_02[新特性]

$
0
0

1.观察者与被观察者升级

如果想在安卓中使用RxJava2.0,可以直接在github上搜索RxAndroid.添加依赖脚本如下:

compile 'io.reactivex.rxjava2:rxandroid:2.0.1'
compile 'io.reactivex.rxjava2:rxjava:2.0.1'

如果你使用的是之前RxJava1.0版本的话,需要添加依赖:

compile 'io.reactivex:rxandroid:1.2.1'
compile 'io.reactivex:rxjava:1.1.6'

本次更新,观察者模式还是RxJava2.0版本的核心,只不过技术上做了一些改进。比如,你在RxJava1.0使用基本的观察者模式,代码框架应该是这样的:

Observable
    .create(new Observable.OnSubscribe<Integer>() {
        @Override
        public void call(Subscriber<? super Integer> subscriber) {
            subscriber.onNext(1);
            subscriber.onNext(2);
            subscriber.onCompleted();
        }
    })
    .subscribe(new Observer<Integer>() {
        @Override
        public void onCompleted() {
            Log.i(TAG, "onCompleted");
        }

        @Override
        public void onError(Throwable e) {
            Log.i(TAG, "onError: " + e);
        }

        @Override
        public void onNext(Integer value) {
            Log.i(TAG, "onNext: " + value);
        }
    });

上面的代码涉及到两个对象:Observable(被观察者)&Observer(观察者)。当然观察者我们也可以使用Subscriber来代替。因为:

public abstract class Subscriber<T> implements Observer<T>, Subscription {
    ...
}

而在RxJava2.0中,Observable(被观察者)&Observer(观察者)模型的代码稍稍做了改动,对比修改的代码如下:

Observable
    //内部的Observable.OnSubscribe对象已经变成ObservableOnSubscribe
    .create(new ObservableOnSubscribe<Integer>() {
        //Subscriber参数已经变成ObservableEmitter 实际上操作是一样的
        @Override
        public void subscribe(ObservableEmitter<Integer> e) throws Exception {
            e.onNext(1);
            e.onNext(2);
            e.onComplete();
        }
    })
    //这里的订阅再也找不到Subscriber类了,只能使用Observer
    .subscribe(new Observer<Integer>() {

        @Override
        public void onSubscribe(Disposable d) {

        }

        @Override
        public void onNext(Integer value) {
            Log.i(TAG, "onNext: "+value);
        }

        @Override
        public void onError(Throwable e) {

        }

        @Override
        public void onComplete() {

        }
    });

在RxJava2.0中,Observable(被观察者)&Observer(观察者)模型对背压的支持不够好,上一节我们已经谈过了。为了让代码更好的支持背压,我们对该模式使用新的对象来代替,这就是Flowable(被观察者)&Subscriber(观察者)。

示例代码如下:

Flowable
    .create(new FlowableOnSubscribe<String>() {
        @Override
        public void subscribe(FlowableEmitter<String> e) throws Exception {
            for (int i = 0; i < 1000; i++) {
                e.onNext(i+"");
            }
            e.onComplete();
        }
    }, BackpressureStrategy.BUFFER)//设置背压模式策略
    .subscribe(new Subscriber<String>() {

        public Subscription sub;
        //Subscription是一个新的接口 可以让观察者主动请求被观察者发送数据 也可以取消请求
        //它提供了2个方法:s.request(n);/s.cancel();
        @Override
        public void onSubscribe(Subscription s) {
            Log.i(TAG, "onSubscribe: ");
            sub=s;
            s.request(2);
        }

        @Override
        public void onNext(String s) {
            Log.i(TAG, "onNext: "+s);
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }

            sub.request(2);
        }

        @Override
        public void onError(Throwable t) {

        }

        @Override
        public void onComplete() {
            Log.i(TAG, "onComplete ");
        }
    });

输出如下:

03-17 15:15:48.244 3753-3753/? I/IT520: onSubscribe: 
03-17 15:15:48.244 3753-3753/? I/IT520: onNext: 0
03-17 15:15:49.244 3753-3753/? I/IT520: onNext: 1 
03-17 15:15:48.244 3753-3753/? I/IT520: onNext: ..
03-17 15:15:49.244 3753-3753/? I/IT520: onNext: ..

上面的代码一开始订阅的时候回调观察者的onSubscribe(),在该方法中,我们先往被观察者请求2条数据。接下来onNext()则会被调用到,当onNext()被调用后,我们先处理完被观察者发送过来的数据 然后继续使用Subscription再次请求数据。

2.其他特殊的被观察者

还记得在RxJava1.0中的Single对象吗,它是一个只能发送成功/失败信息的被观察者,而且只能发送一个。对应的升级版本中,有个新的模型代替:Single/SingleObserver。

此外,还有一个模型也只能发送1个结果数据,那就是Maybe/MaybeObserver。示例代码如下:

Maybe
    .create(new MaybeOnSubscribe<Boolean>() {
        @Override
        public void subscribe(MaybeEmitter<Boolean> e) throws Exception {
            boolean isLogin=true;
            //只能调用e.onError();或者e.onSuccess();
            e.onSuccess(isLogin);
        }
    })
    .subscribeOn(Schedulers.io())
    .observeOn(AndroidSchedulers.mainThread())
    .subscribe(new MaybeObserver<Boolean>() {
        @Override
        public void onSubscribe(Disposable d) {
            //可以调用该对象的dispose取消订阅
            //d.dispose();
        }

        @Override
        public void onSuccess(Boolean value) {
            Log.i(TAG, "onSuccess: "+value);
        }

        @Override
        public void onError(Throwable e) {

        }

        @Override
        public void onComplete() {

        }
    });

3.Action接口的升级

  • RxJava1.0 —>RxJava2.0
  • Action0 —>Action
  • Action1 —>Consumer
  • Action2 —>BiConsumer

示例代码如下:

Observable
    .just("Hello Android")
    .subscribe(new Consumer<String>() {
        @Override
        public void accept(String s) throws Exception { //onNext
            Log.i(TAG, "accept: "+s);
            throw new NullPointerException("mock exception !");
        }
    }, new Consumer<Throwable>() {  //onError
        @Override
        public void accept(Throwable throwable) throws Exception {
            Log.i(TAG, "accept: "+throwable);
        }
    }, new Action() { //onComplete
        @Override
        public void run() throws Exception {

        }
    });

打印如下:

03-17 15:52:05.594 4064-4064/? I/IT520: accept: Hello Android
03-17 15:52:05.594 4064-4064/? I/IT520: accept: java.lang.NullPointerException: mock exception !

不知道你注意到没有。在onNext()方法中支持了抛出异常的处理。完全不需要再次去try/catch,这里更支持Lambda表达式。

4.FuncN接口的升级

Func接口对象内部定义的是,带有一个返回值的方法,而参数可以是1个或者多个。而在RxJava2.0中抛弃了Func3…Func9。而Func1/Func2用如下接口对象代替:

  • RxJava1.0 —>RxJava2.0
  • Func1 —>Function
  • Func2 —>BiFunction

示例代码如下:

Flowable
    .just(1)
    //Func1--->Function
    .map(new Function<Integer, Object>() {
        @Override
        public Object apply(Integer integer) throws Exception {
            return null;
        }
    })
    .subscribe(new Consumer<Object>() {
        @Override
        public void accept(Object o) throws Exception {

        }
    });

5.取消发送null对象

在RxJava1.0中,我们是可以发送null对象的。示例代码如下:

Observable
    .create(new Observable.OnSubscribe<Integer>() {
        @Override
        public void call(Subscriber<? super Integer> subscriber) {
            subscriber.onNext(null);
        }
    })
    .subscribe(new Observer<Integer>() {
        @Override
        public void onCompleted() {
            Log.i(TAG, "onCompleted");
        }

        @Override
        public void onError(Throwable e) {
            Log.i(TAG, "onError: " + e);
        }

        @Override
        public void onNext(Integer value) {
            Log.i(TAG, "onNext: " + value);
        }
    });

而在RxJava2.0之后,已经取消null的发送,代码如下:

Observable
    .create(new ObservableOnSubscribe<Object>() {
        @Override
        public void subscribe(ObservableEmitter<Object> e) throws Exception {
            e.onNext(null);
            e.onNext("Hello Android !");
        }
    })
    .subscribe(new Consumer<Object>() {
        @Override
        public void accept(Object o) throws Exception {
            Log.i(TAG, "accept: " + o);
        }
    }, new Consumer<Throwable>() {
        @Override
        public void accept(Throwable throwable) throws Exception {
            //onNext called with null. Null values are generally not allowed in 2.x operators and sources.
            Log.i(TAG, "accept: "+throwable);
        }
    });

打印的提示已经说了在2.0版本中不需要发送null值。

作者:qq285016127 发表于2017/3/18 0:20:45 原文链接
阅读:231 评论:0 查看评论

Viewing all articles
Browse latest Browse all 5930

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>