2

前言:

随着技术跟实现方式的日新月异,作为程序猿的我们,要么选择紧跟时代潮流,要么选择?带,但是我不会这么轻易的?带,毕竟我这么帅!哈哈,今天给大家带来的是关于RxJava的文章,不是心灵鸡汤,不过味道不错!《给 Android 开发者的 RxJava 详解》这是大神的原文,我将其分解并加入一些自己的理解,帮助大家更好的理解使用

正文:

首先在Android Studio中加入RxJava支持方式:
build.gradle中加入

clipboard.png
然后记得
clipboard.png
这样所需的jar就有了。

基本概念:

何为RxJava:(一个在 Java VM 上使用可观测的序列来组成异步的、基于事件的程序的库)。

RxJava的优势:简洁(一条链式调用,结构比较清晰)

RxJava使用的是一种扩展的观察者模式:
RxJava 有四个基本概念:Observable (可观察者,即被观察者)、 Observer (观察者)、 subscribe (订阅)、事件
ObservableObserver 通过 subscribe() 方法实现订阅关系,从而 Observable 可以在需要的时候发出事件来通知Observer

与传统观察者模式(类似给button注册OnClickListener的方式)不同, RxJava 的事件回调方法除了普通事件 onNext() (相当于 onClick() / onEvent())之外,还定义了两个特殊的事件:onCompleted()onError()

onCompleted(): 事件队列完结。

onError(): 事件队列异常。

基本实现:

根据上面的概念,我们可以知道,主要有三个步骤,
1) 创建 Observer(观察者)

Observer 即观察者,它决定事件触发的时候将有怎样的行为。 RxJava 中的 Observer 接口的实现方式(这里稍微描述一下:被观察者只负责发送通知,要做事情的顺序,跟内容,真正做事情就是观察者的onNext方法,做完之后执行onCompleted方法)

Observer<String> observer = new Observer<String>() {
    @Override
    public void onNext(String s) {
        Log.d(tag, "Item: " + s);
    }

    @Override
    public void onCompleted() {
        Log.d(tag, "Completed!");
    }

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

RxJava 还内置了一个实现了 Observer 的抽象类:Subscriber。 (一开始看,跟订阅的动作subscribe()很像,感觉名字有点眼花,问了土豪之后,原来英文解释就好接受多了:
Observer 观察者 Subscriber订阅者 订阅者有些特殊的要求,所以对前者扩展后,使用更方便,主要体现在onStart()事件发送前执行,和unsubscribe()取消订阅两个方法)
SubscriberObserver 接口进行了一些扩展,但他们的基本使用方式是完全一样的:

Subscriber<String> subscriber = new Subscriber<String>() {
    @Override
    public void onNext(String s) {
        Log.d(tag, "Item: " + s);
    }

    @Override
    public void onCompleted() {
        Log.d(tag, "Completed!");
    }

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

2) 创建 Observable(被观察者)
Observable 即被观察者,它决定什么时候触发事件以及触发怎样的事件。 RxJava 使用 create() 方法来创建一个 Observable ,并为它定义事件触发规则:

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

这个被观察者上面的代码,其实可以理解为一个任务计划,当开始被订阅(Subscribe)的时候,这里可以理解订阅就是开始执行任务清单,然后观察者就一个个的把任务完成的逻辑。这个任务计划,也有简化写法如下:(just(T...)from(T[]) )

//    被观察者
//    Observable observable = Observable.create(new Observable.OnSubscribe<String>() {
//        @Override
//        public void call(Subscriber<? super String> subscriber) {
//            subscriber.onNext("Hello");
//            subscriber.onNext("Hi");
//            subscriber.onNext("Aloha");
//            subscriber.onCompleted();
//        }
//    });

//    //等效以上写法
//    Observable observable = Observable.just("Hello", "Hi", "Aloha");

    //等效以上写法
    String[] words = {"Hello", "Hi", "Aloha"};
    Observable observable = Observable.from(words);

3) Subscribe (订阅)
创建了 ObservableObserver 之后,再用 subscribe() 方法将它们联结起来,整条链子就可以工作了。(可以理解为被观察者的任务计划表开始派给观察者,并执行任务)
如下代码:(组合写法一就是类似内部匿名类的写法,一开始看不容易看,你了解了分离写法的结构的时候,就比较好看了)

    /**
     * 练习Rxjava
     */
    private void practiceRxjava() {
//        1.组合写法:
//        Observable.create(new Observable.OnSubscribe<String>() {
//            @Override
//            public void call(Subscriber<? super String> subscriber) {
//                subscriber.onNext("hello");
//            }
//        }).subscribe(new Subscriber<String>() {
//            @Override
//            public void onCompleted() {
//
//            }
//
//            @Override
//            public void onError(Throwable e) {
//
//            }
//
//            @Override
//            public void onNext(String s) {
//                Log.d("rx", s);
//            }
//        });

//        2.分离写法:
        observable.subscribe(observer);
    }

这样就可以得到如下打印信息:

clipboard.png
自此整体的流程算是走通了(如果想知道为什么可以这么走通,请自行查看源码中的规则,这里只讲述用法。)

总结:

这篇文章是对《给 Android 开发者的 RxJava 详解》的导读,吃饭要一口一口的吃,这样理解起来也更顺畅一些,不过关键的还是要自己去亲自code验证,别人说的再好,也只有自己尝试用了才会发现好处,不然只是别人的,不会是自己的。该文章较长,所以分为多篇,我将跟大家一起学习,并帮助大家理解。最后奉上我的个人技术订阅号,锵哥的觉悟,微信号:DY_suixincq我的博客最新文章会在这里同步推出,欢迎关注交流


heartFollower
467 声望39 粉丝

引用和评论

0 条评论