学习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;