RxAndroid响应式开发(一)

时间:2020-12-01 17:48:50

RxAndroid响应式开发(一)

   

  Rx含义是响应式编程,其本质就是观察者模式,以观察者(Observer)和订阅者(Subscriber)为基础的异步响应方式。

   Observables发出一系列事件,Subscribers处理这些事件。这里的事件可以是任何你感兴趣的东西(触摸事件,异步接口调用返回的数据等)

Rx模式以及优点

使用观察者模式

1、创建:Rx可以方便的创建事件流和数据流

2、组合:Rx使用查询式的操作符和变换数据流

3、监听:Rx可以订阅任何可观察的数据流并执行操作

简化代码

1、Rx的操作符可以将复杂的难题简化为很少的几行代码

2、异步错误处理,传统的try/catch没法处理异步计算,Rx提供了合适的错误处理机制

3、轻松使用并发,Rx的Observables和Schedulers让开发者可以摆脱底层的线程同步和各种并发问题


在说RxAndroid之前先了解下RxJava

  对RxJava最经典的解释就是警察抓小偷,警察需要在小偷伸手作案的时候实施抓捕。在这个例子里,警察是观察者,小偷是被观察者,警察需要时刻盯着小偷的一举一动,才能保证不会漏过任何瞬间。

  观察者模式面向的需求是:A 对象(观察者)对 B 对象(被观察者)的某种变化高度敏感,需要在 B 变化的一瞬间做出反应。

程序的观察者模式和这种真正的『观察』略有不同,观察者不需要时刻盯着被观察者(例如 A 不需要每过 2ms 就检查一次 B 的状

态),而是采用注册(Register)或者称为订阅(Subscribe)的方式,告诉被观察者:我需要你的某某状态,你要在它变化的时候通知

我。 Android 开发中一个比较典型的例子是点击监听器OnClickListener 。对设置 OnClickListener 来说, View 是被观察者,

OnClickListener 是观察者,二者通过setOnClickListener() 方法达成订阅关系。订阅之后用户点击按钮的瞬间,Android

Framework 就会将点击事件发送给已经注册的OnClickListener 。采取这样被动的观察方式,既省去了反复检索状态的资源消耗,

也能够得到最高的反馈速度。当然,这也得益于我们可以随意定制自己程序中的观察者和被观察者,而警察叔叔明显无法要求小偷

『你在作案的时候务必通知我』。


 RxJava四个基本概念:Observable(被观察者)、Observer(观察者)、subscribe(订阅)、事件。

Observable和Observer通过subscribe()方法实现订阅关系,从而Observable可以在需要的时候发出事件来通知Observer。


使用和配置:

  如果只需要使用RxAndroid,只要第一步配置就OK了。

第一步:配置gradle引用,rxjava和rxandroid是必须的。

compile 'io.reactivex:rxjava:1.2.0'
compile 'io.reactivex:rxandroid:1.2.1'
compile 'com.squareup.okhttp3:okhttp:3.4.1'
compile 'com.squareup.okio:okio:1.10.0'
第二步:(如果使用表达式语言,需要配置支持Java,JDK1.8)

compileOptions {
    sourceCompatibility org.gradle.api.JavaVersion.VERSION_1_8
    targetCompatibility org.gradle.api.JavaVersion.VERSION_1_8
}
第三步:(添加表达式支持插件)

apply plugin: 'me.tatarka.retrolambda'
第四步:在工程的gradle中添加(project的gradle)

classpath 'me.tatarka:gradle-retrolambda:2.5.0'


下面使用Java代码实现观察者模式:

创建被观察者接口:

/**
 * 被观察者接口
 */
public interface Watched {

    /**
     * 添加观察者
     * @param watcher
     */
    void addWatcher(Watcher watcher);

    /**
     * 删除观察者
     * @param watcher
     */
    void removeWatcher(Watcher watcher);

    /**
     * 提醒所有的观察者
     * @param str
     */
    void notifyWatchers(String str);

}

被观察者实现类:

/**
 * 被观察者实现类
 */
public class ConcreateWatched implements Watched {

    //保存添加的观察者对象
    private List<Watcher> list = new ArrayList<>();

    @Override
    public void addWatcher(Watcher watcher) {
        list.add(watcher);
    }

    @Override
    public void removeWatcher(Watcher watcher) {
        list.remove(watcher);
    }

    @Override
    public void notifyWatchers(String str) {
        //此处就是,当被观察者发生变化时,通知观察者进行响应
        for (Watcher watcher : list) {
            watcher.update(str);
        }
    }
}

创建观察者接口:

/**
 * 观察者接口
 */
public interface Watcher {

    /**
     * 接收被观察者变化的通知
     *
     * @param str
     */
    void update(String str);
}

观察者实现类:

/**
 * 观察者实现类
 */
public class ConcreateWatcher implements Watcher {
    @Override
    public void update(String str) {
        System.out.println(str);
    }
}

测试类

/**
 * 测试
 */
public class Test {
    public static void main(String[] args) {
        Watched xiaoming = new ConcreateWatched();

        Watcher watcher = new ConcreateWatcher();
        Watcher watcher1 = new ConcreateWatcher();
        Watcher watcher2 = new ConcreateWatcher();

        xiaoming.addWatcher(watcher);
        xiaoming.addWatcher(watcher1);
        xiaoming.addWatcher(watcher2);
        xiaoming.notifyWatchers("我要投偷东西了");
    }
}

运行结果如下:

RxAndroid响应式开发(一)


  这样把观察者订阅给被观察者,当被观察者发生变化时,依次通知与它绑定的观察者。(感觉有点别扭,不应该是被观察者被订阅吗,为什么成了观察者被订阅,这个其实一样的,当被观察者发生变化时,要主动告诉观察者它发生了哪些变化,而不需要观察者时刻去监听啦)。


  学习:给 Android 开发者的 RxJava 详解

   http://www.jianshu.com/p/51a8d2ff8697