学习RxJava之前,需要懂这个响应式编程概念,什么是响应式编程?

答:响应式编程:响应式编程是基于事件的

   举例1(当服务器的数据发送了变化此时马上告诉客户端去更新数据这就是最简单的响应式概念 ) ---> 当服务器的数据发送了变化(属于事件), 客户端去更新数据(基于事件作出的改变)

   举例2(当天气变冷了此时人会穿衣服,这就是响应式编程概念) ---> 当天气变冷了(属于事件),  此时人会穿衣服(这是基于事件而作出的改变)

   举例3(当人饿了人会吃饭,这就是响应式编程概念)--->人饿了(属于事件)人会吃饭(这是基于事件做出的改变)

   ..... 

 

先明白观察者模式,在RxJava中体现观察者模式:

 


 

 

观察者模式:注意 在程序中的观察者模式是 一对多的,一个被观察者 对应 多个观察者

 

 

举例:观察者模式:

 有一个小偷正在准备偷东西(被观察者),有一个警察(观察者) 或 十个警察(观察者) 正在观察小偷的一举一动,当小偷(被观察者)开始偷东西了,十多个警察(观察者)一起知道小偷偷东西了

   

观察者模式Demo:

  1.描述被观察者:Observerable 接口

package com.example.myapplication.observer_patter;

/**
 * 描述被观察者标准(被观察者只有一个)
 */
public interface Observerable {

    /**
     * 在被观察者中订阅一个观察者
     * @param observer
     */
    Observerable registerObserver(Observer observer, String policeName);

    /**
     * 在被观察者中移除一个观察者
     * @param observer
     */
    void removeoObserver(Observer observer);

    /**
     * 在被观察者中 通知所有 >>>> 订阅过的观察者
     */
    void notifyObserver();
}

  2.描述被观察者实现类:ConcreteObserverable

package com.example.myapplication.observer_patter;

import java.util.HashMap;
import java.util.Map;

public class ConcreteObserverable implements Observerable{

    private Map<Observer, String> observers;

    @Override
    public ConcreteObserverable registerObserver(Observer observer, String policeName) {
        if (null == observers) {
            observers = new HashMap<>();
        }

        observers.put(observer, policeName);

        return this;
    }

    @Override
    public void removeoObserver(Observer observer) {
        if (null != observers) {
            observers.remove(observer);
        }
    }

    @Override
    public void notifyObserver() {
        if (null != observers) {

            for (Observer o: observers.keySet()) {
                String name = observers.get(o);
                o.update(name);
            }
        }
    }
}

  3.描述观察者:Observer 接口

package com.example.myapplication.observer_patter;

/**
 * 描述观察者标准(观察者有一个或多个)
 */
public interface Observer {

    /**
     * 在 一个或多个 观察者中,持有 被观察者事件响应>>update
     * 天气冷了(事件/被观察者)    穿衣服(基于>>事件/被观察者 所做出的改变(观察者))
     */
    public void update(String policeName);

    // 还可以扩展其他很多方法
}

  4.描述观察者实现类:ConcreteObserver

package com.example.myapplication.observer_patter;

public class ConcreteObserver implements Observer {

    @Override
    public void update(String name) {
        updateChangeAction(name);
    }

    /**
     * 根据改变所做自己的逻辑处理
     */
    private void updateChangeAction(String policeName) {
        System.out.println("小偷(被观察者) 偷东西了,这位"+ policeName +"警察(观察者)请开始做自己的事情");
        // ....
    }
}

  测试使用代码:Test

package com.example.myapplication.observer_patter;

public class Test {

    public static void main(String[] args) {
        // 创建一个 (被观察者)小偷
        final Observerable observerable = new ConcreteObserverable();

        // 创建多个 (观察者)警察
        Observer observerA = new ConcreteObserver();
        Observer observerB = new ConcreteObserver();
        Observer observerC = new ConcreteObserver();
        Observer observerD = new ConcreteObserver();
        Observer observerE = new ConcreteObserver();
        Observer observerF = new ConcreteObserver();

        // 被观察者  关联、订阅、绑带  多个 观察者
        observerable.registerObserver(observerA, "张三")
                    .registerObserver(observerB, "李四")
                    .registerObserver(observerC, "王五")
                    .registerObserver(observerD, "赵六")
                    .registerObserver(observerE, "初七")
                    .registerObserver(observerF, "刘八")
        ;

        // 被观察者(小偷)开始偷东西了
        observerable.notifyObserver();
    }

}

结果:

  

 

 


 

 

RxJava四要素:

  1.被观察者;

  2.观察者;

  3.订阅;

  4.事件(响应式编程);

 

RxJava在 Android中的Demo案例:

第一步:在 app/build.gradle 中增加库等操作:

   implementation 'io.reactivex:rxjava:1.1.0'
    implementation 'io.reactivex:rxandroid:1.1.0'

 

 第二步:MainActivity具体操作:

 

package com.example.myapplication;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;

import rx.Observable;
import rx.Observer;
import rx.Subscriber;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    /***************** 以下是第一步 ********************/

    /**
     * 第一种方式创建 被观察者
     * 第一步:创建 被观察者
     */
    Observable observable = Observable.create(new Observable.OnSubscribe<String>(){

        /**
         * Subscriber:Subscriber就是观察者,内部进行了封装
         * @param subscriber
         */
        @Override
        public void call(Subscriber<? super String> subscriber) {
            subscriber.onNext("三分归元气"); // subscriber是观察者 观察者.方法 其实就是事件的传递
            subscriber.onNext("排云掌");    // subscriber是观察者 观察者.方法 其实就是事件的传递
            subscriber.onNext("天霜拳");    // subscriber是观察者 观察者.方法 其实就是事件的传递
            subscriber.onNext("风神腿");    // subscriber是观察者 观察者.方法 其实就是事件的传递
            subscriber.onCompleted(); // 事件处理下去

            Log.d("@@@", "第一种方式创建 被观察者 call方法执行完了");
        }
    });

    /**
     * 第二种方式 just创建 被观察者
     * 第一步:创建 被观察者
     */
    // Observable observable = Observable.just("三分归元气", "排云掌", "天霜拳", "风神腿");

    /**
     * 第三种方式 from创建 被观察者
     * 第一步:创建 被观察者
     */
    /*
    String[] from = new String[]{"三分归元气", "排云掌", "天霜拳", "风神腿"};
    Observable observable2 = Observable.from(from);
    */


    /***************** 以下是第二步 ********************/

    /**
     * 第二步:创建 观察者 Observer
     */
    Observer<Object> observer = new Observer<Object>(){

        /**
         * onCompleted方法是:不再有新的事件被 被观察者>>>发出的时候调用 的时候,注意:是不再被 被观察者>>>
         */
        @Override
        public void onCompleted() {
            Log.d("@@@", "观察者 onCompleted");
        }

        /**
         * onError方法是:当处理到有异常信息的时候,会自动收集到此方法的 Throwable e中
         * @param e
         */
        @Override
        public void onError(Throwable e) {
            Log.d("@@@", "观察者 onError e:" + e.getMessage());
        }

        @Override
        public void onNext(Object o) {
            Log.d("@@@", "观察者 onNext o:" + o.toString());
        }
    };

    /**
     * 订阅
     */
    public void bind(View view) {
        // 被观察者 >>> 观察者
        observable.subscribe(observer);
    }
}

 

布局文件:

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="订阅"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        android:onClick="bind"
        />

</android.support.constraint.ConstraintLayout>

 

执行结果:

2019-01-20 15:40:03.765 21950-21950/com.example.myapplication D/@@@: 观察者 onNext o:三分归元气
2019-01-20 15:40:03.765 21950-21950/com.example.myapplication D/@@@: 观察者 onNext o:排云掌
2019-01-20 15:40:03.765 21950-21950/com.example.myapplication D/@@@: 观察者 onNext o:天霜拳
2019-01-20 15:40:03.765 21950-21950/com.example.myapplication D/@@@: 观察者 onNext o:风神腿
2019-01-20 15:40:03.765 21950-21950/com.example.myapplication D/@@@: 观察者 onCompleted
2019-01-20 15:40:03.765 21950-21950/com.example.myapplication D/@@@: 第一种方式创建 被观察者 call方法执行完了

 

 

 关于 rxjava:1.1.0导包:

import rx.Observable;
import rx.Observer;
import rx.Subscriber;

 

关于 rxjava2:rxjava:2.1.14导包:

import io.reactivex.Observable;
import io.reactivex.Observer;