RxJava简单入门

来源:互联网 发布:电脑淘宝怎么看信用 编辑:程序博客网 时间:2024/05/26 02:21

RxJava简单介绍

前言

  • RxJava其实是一种观察者模式,而观察者模式,就必定存在事件源、事件的观察者。而观察者跟事件源也存在着一种订阅的关系,只有事件源被观察者所订阅,观察者才能接收到事件源发生的变化,观察者不用时刻的关注事件源,只有事件源发生改变,观察者便能收到通知。

基本概念

  • 现在说说RxJava所主要涉及到的对象
    1. Observable : 发射源,在观察者模式中担当着“被观察这”和“可观察对象”;
    2. Observer : 观察者,可接收发射源所发射的数据;
    3. Subject : 即可充当发射源,也可充当接受源。为了避免混淆,本文对subject不做详细讲解,将在以后的详细讲解中介绍;
    4. Subscriber : 订阅者,也是接收源,subscriber是继承自observer,可对已订阅的事件取消订阅。observer在subscribe()过程中最终也会转换成subscriber对象;
    5. Subscription : observer调用subscribe()方法返回的对象,同样具有unsubscribe()方法,用来取消订阅;
    6. Action0 : RxJava的一个接口,只有一个无参的call()方法,无返回值,类似的也有Action1、Action2…Action9,call()的参数也依次是1到9个;
    7. Func0 : 与Action0相似,有call()方法,但是有返回值的,同样也有Func1、Func2…Func9。

基本用法

  • observable的创建

最基本的创建方式,create()

Observable.create(new Observable.OnSubscribe<String>() {    @Override    public void call(Subscriber<? super String> subscriber) {    // 发射一个hello的字符串    subscriber.onNext("hello");        }});

使用just()方法,会创出observable对象,并自动调用onNext()方法

Observable.just(6).subscribe(new Action1<Integer>() {    @Override    public void call(Integer integer) {        // integer就是just()方法传入的参数6    }});

使用from(),会遍历集合或数组,发送每一个item

Observable.from(new String[]{ "hello", "android" }).subscribe(new Action1<String>() {    @Override    public void call(String s) {        // 会依次的拿到"hello"、"android"    }});
  • observer的创建
    只能通过一般的new来创建
Observer<String> observer = new Observer<String>() {    @Override    public void onCompleted() {        // 数据接收完成    }    @Override    public void onError(Throwable e) {        // 数据接收出错    }    @Override    public void onNext(String s) {    }};

有了observable跟observer对象,就可以订阅事件,想怎么玩都行了。上面通过just()跟from()创建的observable对象,是通过new Action1来订阅的,下面将通过另外一种方式,就是observable直接订阅observer对象。

Observable.just("hello").subscribe(observer);

在上面的onNext()中就可以拿到”hello”字符串,然后就可以做一系列处理,是不是很简单明了。当然,如果不需要关心数据是否接收完成跟是否会出错,可以直接用上面的new Action1作为参数传入subscribe(),在call()中做处理。


以上就是RxJava最简单的用法,虽然代码并没有比一般写法要少,但代码结构很整洁,逻辑也十分清晰,或者到了代码逻辑变了很多时,才能更好地体现RxJava的优雅。
现在有这样一个需求,有一个字符串,使用逗号间隔开的一串数字,要把大于0的取出来,然后再把拿到的数的两倍在打印出来。下面就直接上RxJava代码:

Observable.just("2, 4, 0, -3, 5, 7, -6, -2, 9, -10")                .flatMap(new Func1<String, Observable<String>>() {    @Override    public Observable<String> call(String s) {        // 返回每个item的一个observable对象        return Observable.from(s.split(","));    }})    .filter(new Func1<String, Boolean>() {        @Override        public Boolean call(String s) {            // 过滤掉不大于0的数            return Integer.valueOf(s) > 0;    }})    .map(new Func1<String, Integer>() {        @Override        public Integer call(String s) {            // 对拿到的每一个数进行处理            Integer integer = Integer.valueOf(s);            integer *= 2;            return integer;        }})    .subscribe(new Action1<Integer>() {        @Override        public void call(Integer integer) {            // 得到最后结果            Log.d("result", String.valueOf(integer));    }});

容易看出,思路是非常的清晰,而且还是一个链式编程,在逻辑变得愈加的复杂,代码还能保持简洁,可读性强。

总结

看了RxJava简单的介绍与及一些例子的应用,想必入门并没有原来想的那么难,如果上面的例子都理解了,我相信你已经跨进了RxJava的大门,剩下的就是继续学习实际的应用场景,还有各种强大的操作符,结合实际的例子进行学习,便能完完全全的掌握其中的奥妙。


另外,本人是初次写博客,有什么知识不全面的,请大家多包涵,如有什么好的建议,欢迎留言,可以一起探讨学习、交流!

0 0