Android:入门神秘Rxjava(本文主要基于Rxjava 2.0)

来源:互联网 发布:软件设计师 证书 编辑:程序博客网 时间:2024/06/06 03:33

Rxjava是什么?

官方介绍:

RxJava:a library for composing asynchronous and event-based programs using observable sequences for the Java VM// 翻译:RxJava 是一个在 Java VM 上使用可观测的序列来组成异步的、基于事件的程序的库

总结: 是一个基于事件流和实现异步操作的库,类似于AsyncTask Handler的作用;
原理: 被观察者(Observable)通过订阅(Subscribe)按顺序发送事件(Event)给观察者(Observer),观察者按顺序接受事件并作出处理;

Rxjava基本使用一(同步)

基本使用(一) : 代码简洁 从上到下链式调用

      //创建被观察者 Observable 对象 决定什么时候触发事件以及触发什么样的事件       Observable.create(new Observable.OnSubscribe<Integer>() {        @Override           public void onStart() {               //事件未发送之前调用 用于做一些准备工作,比如重置数据或者清零               super.onStart();           }           @Override           public void call(Subscriber<? super Integer> subscriber) {               //发送事件 相当于 onClick();               subscriber.onNext(1);               subscriber.onNext(2);               subscriber.onNext(3);               //事件队列完结,当不会有新的onNext,会触发此方法               subscriber.onCompleted();           }       }).subscribe(new Subscriber<Integer>() {           //创建被观察者对象           @Override           public void onCompleted() {               Log.i(TAG, "对Complete事件作出响应");           }           @Override           public void onError(Throwable e) {               //异常 同时会触发此方法 不允许再有事件发出               //onCompleted()和 onError()二者相互排斥 只能调用其一               Log.i(TAG, "对Error事件作出响应");           }           @Override           public void onNext(Integer integer) {               Log.i(TAG, "对Next事件"+ integer +"作出响应"  );           }       });

打印日志

12-04 11:51:28.295 10585-10585/com.test D/Rxjava: 对Next事件1作出响应12-04 11:51:28.295 10585-10585/com.test D/Rxjava: 对Next事件2作出响应12-04 11:51:28.295 10585-10585/com.test D/Rxjava: 对Next事件3作出响应12-04 11:51:28.295 10585-10585/com.test D/Rxjava: 对Complete事件作出响应

基本使用(二) :

 Observer<Integer> observer=new Observer<Integer>() {            @Override            public void onCompleted() {            }            @Override            public void onError(Throwable e) {            }            @Override            public void onNext(Integer integer) {            }        };

除了 Observer 接口之外,RxJava 还内置了一个实现了 Observer 的抽象类:Subscriber。 Subscriber 对 Observer 接口进行了一些扩展,他们的基本使用方式是完全一样的;

Rxjava的快速创建事件队列:

Observable observable = Observable.just(1, 2, 3);

创建了 Observable 和 Observer 之后,再用 subscribe() 方法将它们联结起来:

observable.subscribe(observer);// 或者:observable.subscribe(subscriber);

上面的方法实现的是同步的观察者模式;

Rxjava基本使用二(异步)

线程控制–Scheduler

Rxjava遵循的是线程不变的原则,哪里调用subscribe(),就在哪里生产事件; 那个线程生产事件,就在那个线程处理事件,如果是垮线程,就需要用到scheduler;(调度器也叫线程控制器);

  • Schedulers.immediate(): 默认在当前线程执行;
  • Schedulers.newThread(): 总是启动新的线程,在新线程中执行操作;
  • Schedulers.io(): (读写文件,读写数据库.网络信息交互等)与newThread()的区别在于io()内部实现使用一个无数量上线的线程池组成,可以重用空闲的线程,所以在一般情况下比newThread()更有效;
  • Schedulers.computation(): 计算所使用的,这个计算是的是CPU 密集型计算,即不会被 I/O 等操作限制性能的操作,例如图形的计算;
  • AndroidSchedulers.mainThread(): 安卓专用的主线程;

通过 subscribeOn() 指定事件产生的线程或者所发生的线程;observeOn() 指定事件消费的线程或者所运行的线程;如下代码所示:

Observable.just(1, 2, 3, 4)    // 指定 subscribe() 发生在 IO 线程    .subscribeOn(Schedulers.io())     // 指定 Subscriber 的回调发生在主线程    .observeOn(AndroidSchedulers.mainThread())     .subscribe(new Action1<Integer>() {        @Override        public void call(Integer number) {            Log.d(tag, "number:" + number);        }    });

以上代码的格式几乎算是非常常见,[ 后台线程取数据,前台线程显示 ];

原创粉丝点击