Rxjava基本使用

移动开发 waitig 419℃ 百度已收录 0评论

Rxjava自去年开始热度越来越高,自己也开始在之后的项目中使用这个开源库。不用不知道,谁用谁知道,真的是太爽了。现在稍微闲下来点,所以就花点时间把该库的一些用法好好总结下。Rxjava主要在android中用来做一些异步操作,能够实现线程间快速切换,它和Thread + Handler ,AsyncTak做异步操作相比代码更加简洁,后期维护更加方便。

1.使用该库的时候首先需要在项目的build.gradle中添加依赖

    compile 'io.reactivex:rxjava:1.0.14'
    compile 'io.reactivex:rxandroid:1.0.1'

2.Rxjava使用:
   Rxjava采用观察者设计模式,首先创建Observable(被观察者)和Observer(观察者),通过subscribe()实现两者的订阅关系,在需要的时候Observable发出事件来通知Observer。
   2.1.创建Observable
    查看Observable源码,其构造方法被Protected所修饰,所以我们不能直接通过new来创建其实例,但是Observable为我们提供了大量的static方法获取Obserbale实例对象。
     2.1.1.使用create()创建Observable:

    Observable<String> observable = Observable.create(new Observable.OnSubscribe<String>() {
           @Override
           public void call(Subscriber<? super String> subscriber) {
                subscriber.onNext("Hello RxJava!");
                subscriber.onCompleted();
           }
    });

    //创建被观察者之后,还需要创建观察者,然后通过subscribe()将观察者注册到被观察者上,当被观察者被订阅以后就会自动调用call()方法。

    //创建观察者:
    Observer<String> observer = new Observer<String>() {
            @Override
            public void onCompleted() {
                Log.e(tag , "onCompeleted..");
            }

            @Override
            public void onError(Throwable e) {
                Log.e(tag , "onError..");
            }

            @Override
            public void onNext(String str) {
                Log.e(tag , "onNext: " + str);
            }
        }; 

    //添加订阅,订阅成功以后,Observable会自动调用call()方法,这样观察者将会调用onNext()和onComplete()方法。执行默认情况下call()方法和observer中的方法都是运行在主线程中的。我们可以通过subscribeOn()和observeOn()来指定被观察者和观察者运行的线程。

    observable.subscribeOn(Schedulers.io())   //指定被观察者运行的线程,即call()方法在哪个现场中执行
       .observeOn(AndroidSchedulers.mainThread()) //指定观察者运行的线程,mainThread是android主线程
       .subscribe(observer);        // 将观察者注册到被观察者上

    //打印结果
    onNext: Hello RxJava!
    onCompeleted..

     2.1.2.通过from()创建Observable对象

      //使用from(T[] arr)或者from(Iterable iterable)创建Observable,内部会对其传入的数据进行遍历,然后调用subscribe的onNext()方法,遍历结束以后会调用subscribe的onComplete()方法。

     Observable.from(new String[]{"hello" , "rxjava"})
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(new Subscriber<String>() {
                    @Override
                    public void onCompleted() {
                        Log.e(tag , "onCompleted..");
                    }

                    @Override
                    public void onError(Throwable e) {

                    }

                    @Override
                    public void onNext(String s) {
                        Log.e(tag , "onNext: " + s);
                    }
                });

    //打印结果
    onNext: hello
    onNext: rxjava
    onCompleted..

     2.1.3.通过interval()创建Observable对象

    //interval()返回一个Observable,它按固定的时间间隔发射一个无限递增的整数序列 
    Observable.interval(1 , TimeUnit.SECONDS)
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(new Action1<Long>() {
                    @Override
                    public void call(Long aLong) {
                        KLog.e("call: " + aLong.longValue());
                    }
                });
    //打印结果
    call:0
    call:1
    call:2
    ....

     2.1.4.使用just()创建Observable对象

        //just()将单个数据转换为发射该数据的Observable, 它和from类似,但是from会将数组或者iterable数据取出来逐个发射,而just只是原样发射,将数组或iterable当作单个数据。它接受一至九个参数。
        List<String> strs = new ArrayList<>();
        strs.add("Hello");
        strs.add("Rxjava");
        Observable.just(strs)
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(new Observer<List<String>>() {
                    @Override
                    public void onCompleted() {
                       Log.e(tag , "onCompleted...");
                    }

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

                    @Override
                    public void onNext(List<String> strings) {
                        Log.e(tag , "onNext: " + strings.toString());
                    }
                });

        //打印结果
        onNext:[Hello, Rxjava]
        onCompleted...

     2.1.5.使用range()创建Observable对象

        //使用range()创建发送指定整数序列的Observable , range(int start , int count) , start表示启始值 , count表示数据的个数,count为0时不发射任何数据,为负数时候会抛异常。
          Observable.range(2 , 5)
                .subscribeOn(Schedulers.computation())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(new Observer<Integer>() {
                    @Override
                    public void onCompleted() {
                        Log.e(tag , "onCompleted...");
                    }

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

                    @Override
                    public void onNext(Integer integer) {
                        Log.e(tag , "onNext: " + integer);
                    }
                });
        //打印结果
        onNext:2
        onNext:3
        onNext:4
        onNext:5
        onNext:6
        onCompleted...

     2.1.6.使用timer()创建Observable对象

        //通过timer()可以创建一个指定延时之后发射数据的Observable
         Observable.timer(2 , TimeUnit.SECONDS)
                .subscribeOn(Schedulers.computation())
                .subscribeOn(AndroidSchedulers.mainThread())
                .subscribe(new Observer<Long>() {
                    @Override
                    public void onCompleted() {
                        Log.e(tag , "onCompleted...");
                    }

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

                    @Override
                    public void onNext(Long aLong) {
                         Log.e(tag , "onNext: " + aLong);
                    }
                });
        //掩饰2s以后控制台打印:
        onNext:0
        onCompleted...


本文由【waitig】发表在等英博客
本文固定链接:Rxjava基本使用
欢迎关注本站官方公众号,每日都有干货分享!
等英博客官方公众号
点赞 (0)分享 (0)