参考学习视频:一堂课深度解读Rxjava,从零手写RxJava核心架构
Carson带你学Android:手把手带你入门神秘的Rxjava
RxJava之七——RxJava 2.0 图文分析create()、 subscribe()、map()、observeOn()、subscribeOn()源码
导序
Rxjava对应的是观察者模式:
观察者模式三要素:
1.事件订阅/ 关系确立 (被观察者 实例化的顺序)
2. 观察者上溯 (subscribe 往上传到)
3. 事件响应/事件通知 (观察者一个一个往下回调)
链式调度流程如下图所示:(观察者与被观察者是N:N)
其中:
事件订阅流程:①–>②–>③
观察者上溯流程:④–>⑤–>⑥
事件响应流程:⑦–>⑧–>⑨
整个事件的流程为:①–>②–>③–>④–>⑤–>⑥–>⑦–>⑧–>⑨–>⑩
一、create操作符的使用
被观察者:Observable.java
/**
* 被观察者
* @param <T>
*/
public abstract class Observable<T> {
//创建型操作 包装
public static <T> Observable create(Observable<T> observable) {
return observable;
}
//事件订阅
public abstract void subscribe(Observer<T> observer);
}
观察者:Observer.java
/**
* 观察者
* @param <T>
*/
public interface Observer<T> {
void onNext(T t);
void onCompleted();
void OnError(Throwable e);
}
UI调用层:MainActivity.java
package com.test.rxjavademo2;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
public class MainActivity extends AppCompatActivity {
private static final String TAG = "abc";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
public void click(View view) {
Observable.create(new Observable<String>() {
@Override
public void subscribe(Observer<String> observer) {
observer.onNext("hello world");
}
}).subscribe(new Observer() {
@Override
public void onCompleted() {
}
@Override
public void OnError(Throwable throwable) {
}
@Override
public void onNext(Object o) {
Log.d(TAG, "观察者接收的数据为:" + o.toString());
}
});
}
}
其实上面的代码流程中:
其中,create()方法就是将传入的参数进行了返回。
执行new Observable()方法进行创建被观察者:
-
调用的subscribe(如上图中的1)对应调用如上图中的2的subscribe
-
上图中①中的new Observer()会传给上图中②的参数observer
-
执行上图中Ⅰ的observer.onNext()其实是调用上图中Ⅱ的onNext()方法。
上图的代码可以转换为:
public void click(View view) {
Observable observable = Observable.create(new Observable<String>() {
@Override
public void subscribe(Observer<String> observer) {
for (int i = 0; i < 10; i++) {
observer.onNext("value = " + i);
}
}
});
observable.subscribe(new Observer<String>() {
@Override
public void onNext(String s) {
Log.d(TAG, "观察者接收的数据" + s);
}
@Override
public void onCompleted() {
}
@Override
public void OnError(Throwable e) {
}
});
}
假如在被观察者类中添加一个flatMap接口方法:
package com.test.rxjavademo2;
import android.util.Log;
/**
* 被观察者
* @param <T>
*/
public abstract class Observable<T> {
private static final String TAG = "abc";
//创建型操作 包装
public static <T> Observable create(Observable<T> observable) {
return observable;
}
//事件订阅
public abstract void subscribe(Observer<T> observer);
public Observable<T> flatMap() {
return new Observable<T>() { //1
@Override
public void subscribe(Observer<T> observerC) {
Observer<T> observerB = new Observer<T>() {
@Override
public void onNext(T t) {
Log.d(TAG, "observerC--onNext");
observerC.onNext(t);
}
@Override
public void onCompleted() {
observerC.onCompleted();
}
@Override
public void onError(Throwable e) {
observerC.onError(e);
}
};
// this.subscribe(observerC); //这个this指的是1位置那行new Observable对象
Log.d(TAG, "this=" + this + ", Observable.this=" + Observable.this); //this=com.test.rxjavademo2.Observable$1@8bee5b5, Observable.this=com.test.rxjavademo2.MainActivity$2@243244a
Observable.this.subscribe(observerB); //这个 Observable.this指的是最外面即创建的Observable对象
}
};
}
}
在MainActivity.java中调用该flatMap()方法
package com.test.rxjavademo2;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
public class MainActivity extends AppCompatActivity {
private static final String TAG = "abc";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
public void click(View view) {
Observable.create(new Observable<String>() {
@Override
public void subscribe(Observer<String> observer) {
Log.d(TAG, "Observable--onNext");
for (int i = 0; i < 10; i++) {
observer.onNext("value = " + i);
}
observer.onCompleted();
}
}).flatMap().flatMap().flatMap().subscribe(new Observer<String>() {
@Override
public void onNext(String s) {
Log.d(TAG, "观察者接收的数据" + s);
}
@Override
public void onCompleted() {
Log.d(TAG, "观察者接收完成");
}
@Override
public void onError(Throwable e) {
}
});
}
}
上面click方法可以拆解为:
public void click(View view) {
Observable observable = Observable.create(new Observable<String>() {
@Override
public void subscribe(Observer<String> observer) {
Log.d(TAG, "Observable--onNext");
for (int i = 0; i < 10; i++) {
observer.onNext("value = " + i);
}
observer.onCompleted();
}
});
Observable observable1 = observable.flatMap();
Observable observable2 = observable1.flatMap();
Observable observable3 = observable2.flatMap();
observable3.subscribe(new Observer<String>() { //最终监听结果
@Override
public void onNext(String s) {
Log.d(TAG, "观察者接收的数据" + s);
}
@Override
public void onCompleted() {
Log.d(TAG, "观察者接收完成");
}
@Override
public void onError(Throwable e) {
}
});
}
log输出的结果:
2021-07-06 13:39:57.255 8294-8294/com.test.rxjavademo2 D/abc: this=com.test.rxjavademo2.Observable$1@1973b16, Observable.this=com.test.rxjavademo2.Observable$1@a690c97
2021-07-06 13:39:57.255 8294-8294/com.test.rxjavademo2 D/abc: this=com.test.rxjavademo2.Observable$1@a690c97, Observable.this=com.test.rxjavademo2.Observable$1@45a8e84
2021-07-06 13:39:57.256 8294-8294/com.test.rxjavademo2 D/abc: this=com.test.rxjavademo2.Observable$1@45a8e84, Observable.this=com.test.rxjavademo2.MainActivity$2@13166d
2021-07-06 13:39:57.256 8294-8294/com.test.rxjavademo2 D/abc: Observable--onNext
2021-07-06 13:39:57.257 8294-8294/com.test.rxjavademo2 D/abc: observerC--onNext
2021-07-06 13:39:57.257 8294-8294/com.test.rxjavademo2 D/abc: observerC--onNext
2021-07-06 13:39:57.257 8294-8294/com.test.rxjavademo2 D/abc: observerC--onNext
2021-07-06 13:39:57.257 8294-8294/com.test.rxjavademo2 D/abc: 观察者接收的数据value = 0
2021-07-06 13:39:57.257 8294-8294/com.test.rxjavademo2 D/abc: observerC--onNext
2021-07-06 13:39:57.257 8294-8294/com.test.rxjavademo2 D/abc: observerC--onNext
2021-07-06 13:39:57.257 8294-8294/com.test.rxjavademo2 D/abc: observerC--onNext
2021-07-06 13:39:57.257 8294-8294/com.test.rxjavademo2 D/abc: 观察者接收的数据value = 1
2021-07-06 13:39:57.257 8294-8294/com.test.rxjavademo2 D/abc: observerC--onNext
2021-07-06 13:39:57.257 8294-8294/com.test.rxjavademo2 D/abc: observerC--onNext
2021-07-06 13:39:57.257 8294-8294/com.test.rxjavademo2 D/abc: observerC--onNext
2021-07-06 13:39:57.257 8294-8294/com.test.rxjavademo2 D/abc: 观察者接收的数据value = 2
2021-07-06 13:39:57.257 8294-8294/com.test.rxjavademo2 D/abc: observerC--onNext
2021-07-06 13:39:57.257 8294-8294/com.test.rxjavademo2 D/abc: observerC--onNext
2021-07-06 13:39:57.257 8294-8294/com.test.rxjavademo2 D/abc: observerC--onNext
2021-07-06 13:39:57.257 8294-8294/com.test.rxjavademo2 D/abc: 观察者接收的数据value = 3
2021-07-06 13:39:57.257 8294-8294/com.test.rxjavademo2 D/abc: observerC--onNext
2021-07-06 13:39:57.257 8294-8294/com.test.rxjavademo2 D/abc: observerC--onNext
2021-07-06 13:39:57.257 8294-8294/com.test.rxjavademo2 D/abc: observerC--onNext
2021-07-06 13:39:57.257 8294-8294/com.test.rxjavademo2 D/abc: 观察者接收的数据value = 4
2021-07-06 13:39:57.257 8294-8294/com.test.rxjavademo2 D/abc: observerC--onNext
2021-07-06 13:39:57.257 8294-8294/com.test.rxjavademo2 D/abc: observerC--onNext
2021-07-06 13:39:57.257 8294-8294/com.test.rxjavademo2 D/abc: observerC--onNext
2021-07-06 13:39:57.257 8294-8294/com.test.rxjavademo2 D/abc: 观察者接收的数据value = 5
2021-07-06 13:39:57.257 8294-8294/com.test.rxjavademo2 D/abc: observerC--onNext
2021-07-06 13:39:57.257 8294-8294/com.test.rxjavademo2 D/abc: observerC--onNext
2021-07-06 13:39:57.257 8294-8294/com.test.rxjavademo2 D/abc: observerC--onNext
2021-07-06 13:39:57.258 8294-8294/com.test.rxjavademo2 D/abc: 观察者接收的数据value = 6
2021-07-06 13:39:57.258 8294-8294/com.test.rxjavademo2 D/abc: observerC--onNext
2021-07-06 13:39:57.258 8294-8294/com.test.rxjavademo2 D/abc: observerC--onNext
2021-07-06 13:39:57.258 8294-8294/com.test.rxjavademo2 D/abc: observerC--onNext
2021-07-06 13:39:57.258 8294-8294/com.test.rxjavademo2 D/abc: 观察者接收的数据value = 7
2021-07-06 13:39:57.258 8294-8294/com.test.rxjavademo2 D/abc: observerC--onNext
2021-07-06 13:39:57.258 8294-8294/com.test.rxjavademo2 D/abc: observerC--onNext
2021-07-06 13:39:57.258 8294-8294/com.test.rxjavademo2 D/abc: observerC--onNext
2021-07-06 13:39:57.258 8294-8294/com.test.rxjavademo2 D/abc: 观察者接收的数据value = 8
2021-07-06 13:39:57.258 8294-8294/com.test.rxjavademo2 D/abc: observerC--onNext
2021-07-06 13:39:57.258 8294-8294/com.test.rxjavademo2 D/abc: observerC--onNext
2021-07-06 13:39:57.258 8294-8294/com.test.rxjavademo2 D/abc: observerC--onNext
2021-07-06 13:39:57.258 8294-8294/com.test.rxjavademo2 D/abc: 观察者接收的数据value = 9
2021-07-06 13:39:57.258 8294-8294/com.test.rxjavademo2 D/abc: 观察者接收完成
二、map操作符的使用
添加一个转换函数Function.java
package com.test.rxjavademo2;
/**
* 转换操作符 比如:将url转换为Bitmap
*/
public interface Function<T, R> {
R apply(T t);
}
在被观察者Observable.java中添加map()方法:
public <R> Observable<R> map(final Function<T, R> function) {
return new Observable<R>() {
@Override
public void subscribe(Observer<R> observerC) {
Observer<T> observerB = new Observer<T>() {
@Override
public void onNext(T t) {
R r = function.apply(t); //该操作发生在事件回调流程中
Log.d(TAG, "observerC--onNext t=" + t + ", r=" + r); //输出log:observerC--onNext t=http://baidu.com/1.png, r=android.graphics.Bitmap@f35a625
observerC.onNext(r);
}
@Override
public void onCompleted() {
observerC.onCompleted();
}
@Override
public void onError(Throwable e) {
observerC.onError(e);
}
};
Observable.this.subscribe(observerB);
}
};
}
在MainActivity.java中进行调用:
public void map(View view) {
Observable.create(new Observable<String>() {
@Override
public void subscribe(Observer<String> observer) {
observer.onNext("http://baidu.com/1.png");
observer.onCompleted();
}
}).map(new Function<String, Bitmap>() {
@Override
public Bitmap apply(String url) {
Log.d(TAG, "开始下载文件:" + url);
Bitmap bitmap = downLoad(url);
Log.d(TAG, "下载图片成功: " + bitmap);
return bitmap;
}
}).subscribe(new Observer<Bitmap>() {
@Override
public void onNext(Bitmap bitmap) {
Log.d(TAG, "回调应用层 通知观察者: " + bitmap.toString());
}
@Override
public void onCompleted() {
Log.d(TAG, "回调应用层 下载完成");
}
@Override
public void onError(Throwable e) {
}
});
}
private Bitmap downLoad(String url) {
return BitmapFactory.decodeResource(getResources(), R.mipmap.ic_launcher);
}
输出结果:
2021-07-06 14:41:11.033 9280-9280/com.test.rxjavademo2 D/abc: 开始下载文件:http://baidu.com/1.png
2021-07-06 14:41:11.036 9280-9280/com.test.rxjavademo2 D/abc: 下载图片成功: android.graphics.Bitmap@f35a625
2021-07-06 14:41:11.036 9280-9280/com.test.rxjavademo2 D/abc: observerC--onNext t=http://baidu.com/1.png, r=android.graphics.Bitmap@f35a625
2021-07-06 14:41:11.036 9280-9280/com.test.rxjavademo2 D/abc: 回调应用层 通知观察者: android.graphics.Bitmap@f35a625
2021-07-06 14:41:11.036 9280-9280/com.test.rxjavademo2 D/abc: 回调应用层 下载完成
三、线程切换
在被观察者Observable.java中添加子线程切换接口方法subscribeOn()
package com.test.rxjavademo2;
import android.util.Log;
/**
* 被观察者
* @param <T>
*/
public abstract class Observable<T> {
private static final String TAG = "abc";
//创建型操作 包装
public static <T> Observable create(Observable<T> observable) {
return observable;
}
//事件订阅
public abstract void subscribe(Observer<T> observer);
public Observable<T> flatMap() {
return new Observable<T>() { //1
@Override
public void subscribe(Observer<T> observerC) {
Observer<T> observerB = new Observer<T>() {
@Override
public void onNext(T t) {
Log.d(TAG, "observerC--onNext");
observerC.onNext(t);
}
@Override
public void onCompleted() {
observerC.onCompleted();
}
@Override
public void onError(Throwable e) {
observerC.onError(e);
}
};
// this.subscribe(observerC); //这个this指的是1位置那行new Observable对象
Log.d(TAG, "this=" + this + ", Observable.this=" + Observable.this); //this=com.test.rxjavademo2.Observable$1@8bee5b5, Observable.this=com.test.rxjavademo2.MainActivity$2@243244a
Observable.this.subscribe(observerB); //这个 Observable.this指的是最外面即创建的Observable对象
}
};
}
public <R> Observable<R> map(final Function<T, R> function) {
return new Observable<R>() {
@Override
public void subscribe(Observer<R> observerC) {
Observer<T> observerB = new Observer<T>() {
@Override
public void onNext(T t) {
R r = function.apply(t); //该操作发生在事件回调流程中
Log.d(TAG, "observerC--onNext t=" + t + ", r=" + r); //输出log:observerC--onNext t=http://baidu.com/1.png, r=android.graphics.Bitmap@f35a625
observerC.onNext(r);
}
@Override
public void onCompleted() {
observerC.onCompleted();
}
@Override
public void onError(Throwable e) {
observerC.onError(e);
}
};
Observable.this.subscribe(observerB);
}
};
}
public Observable subscribeOn() {
return new Observable<T>() {
@Override
public void subscribe(Observer<T> observer) { //发生在观察者上溯流程中
new Thread(){
@Override
public void run() {
Observer<T> observerB = new Observer<T>() {
@Override
public void onNext(T t) {
Log.d(TAG, "subscribeOn--onNext");
observer.onNext(t);
}
@Override
public void onCompleted() {
observer.onCompleted();
}
@Override
public void onError(Throwable e) {
observer.onError(e);
}
};
Observable.this.subscribe(observerB);
}
}.start();
}
};
}
}
特别注意:切换到子线程操作,需要将subscribe()里面的操作执行在子线程中,即子线程发生在观察者回溯流程中
MainActivity.java
package com.test.rxjavademo2;
import androidx.appcompat.app.AppCompatActivity;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
public class MainActivity extends AppCompatActivity {
private static final String TAG = "abc";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
public void create(View view) {
Observable.create(new Observable<String>() {
@Override
public void subscribe(Observer<String> observer) {
Log.d(TAG, "Observable--onNext");
for (int i = 0; i < 10; i++) {
observer.onNext("value = " + i);
}
observer.onCompleted();
}
}).flatMap().subscribe(new Observer<String>() { //最终监听结果
@Override
public void onNext(String s) {
Log.d(TAG, "观察者接收的数据" + s);
}
@Override
public void onCompleted() {
Log.d(TAG, "观察者接收完成");
}
@Override
public void onError(Throwable e) {
}
});
}
public void map(View view) {
Observable.create(new Observable<String>() {
@Override
public void subscribe(Observer<String> observer) {
observer.onNext("http://baidu.com/1.png");
observer.onCompleted();
}
}).map(new Function<String, Bitmap>() {
@Override
public Bitmap apply(String url) {
Log.d(TAG, "开始下载文件:" + url);
Bitmap bitmap = downLoad(url);
Log.d(TAG, "下载图片成功: " + bitmap);
return bitmap;
}
}).subscribe(new Observer<Bitmap>() {
@Override
public void onNext(Bitmap bitmap) {
Log.d(TAG, "回调应用层 通知观察者: " + bitmap.toString());
}
@Override
public void onCompleted() {
Log.d(TAG, "回调应用层 下载完成");
}
@Override
public void onError(Throwable e) {
}
});
}
private Bitmap downLoad(String url) {
return BitmapFactory.decodeResource(getResources(), R.mipmap.ic_launcher);
}
public void thread(View view) {
Observable.create(new Observable<String>() {
@Override
public void subscribe(Observer<String> observer) {
Log.d(TAG, "Observable--onNext");
observer.onNext("http://baidu.com/1.png");
observer.onCompleted();
Log.d(TAG, "被观察者:" + Thread.currentThread().getName());
}
}).map(new Function<String, Bitmap>() {
@Override
public Bitmap apply(String url) {
Log.d(TAG, "开始下载文件:" + url);
Bitmap bitmap = downLoad(url);
Log.d(TAG, "下载图片成功: " + bitmap);
return bitmap;
}
}).subscribeOn().subscribe(new Observer<Bitmap>() {
@Override
public void onNext(Bitmap bitmap) {
Log.d(TAG, "回调应用层 通知观察者: " + bitmap.toString());
Log.d(TAG, "观察者:" + Thread.currentThread().getName());
}
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
}
});
}
}
输出结果为:
2021-07-06 16:08:18.923 10889-10931/com.test.rxjavademo2 D/abc: Observable--onNext
2021-07-06 16:08:18.923 10889-10931/com.test.rxjavademo2 D/abc: 开始下载文件:http://baidu.com/1.png
2021-07-06 16:08:18.927 10889-10931/com.test.rxjavademo2 D/abc: 下载图片成功: android.graphics.Bitmap@4d3524c
2021-07-06 16:08:18.927 10889-10931/com.test.rxjavademo2 D/abc: observerC--onNext t=http://baidu.com/1.png, r=android.graphics.Bitmap@4d3524c
2021-07-06 16:08:18.927 10889-10931/com.test.rxjavademo2 D/abc: subscribeOn--onNext
2021-07-06 16:08:18.927 10889-10931/com.test.rxjavademo2 D/abc: 回调应用层 通知观察者: android.graphics.Bitmap@4d3524c
2021-07-06 16:08:18.927 10889-10931/com.test.rxjavademo2 D/abc: 观察者:Thread-2
2021-07-06 16:08:18.928 10889-10931/com.test.rxjavademo2 D/abc: 被观察者:Thread-2
如果将最后的观察者设置到主线程中执行:
特别注意:切换到主线程操作,应该发生中事件响应流程中
在被观察者Observable.java中添加observeOn()接口
Handler handler = new Handler(Looper.getMainLooper());
// 切换到主线程
public Observable observeOn() {
return new Observable<T>() {
@Override
public void subscribe(Observer<T> observer) {
Observer<T> observerB = new Observer<T>() {
@Override
public void onNext(T t) {
handler.post(new Runnable() {
@Override
public void run() {
observer.onNext(t);
}
});
}
@Override
public void onCompleted() {
handler.post(new Runnable() {
@Override
public void run() {
observer.onCompleted();
}
});
}
@Override
public void onError(Throwable e) {
handler.post(new Runnable() {
@Override
public void run() {
observer.onError(e);
}
});
}
};
Observable.this.subscribe(observerB);
}
};
}
在MainActivity调用改为为:
public void thread(View view) {
Observable.create(new Observable<String>() {
@Override
public void subscribe(Observer<String> observer) {
Log.d(TAG, "Observable--onNext");
observer.onNext("http://baidu.com/1.png");
observer.onCompleted();
Log.d(TAG, "被观察者:" + Thread.currentThread().getName());
}
}).map(new Function<String, Bitmap>() {
@Override
public Bitmap apply(String url) {
Log.d(TAG, "开始下载文件:" + url);
Bitmap bitmap = downLoad(url);
Log.d(TAG, "下载图片成功: " + bitmap);
return bitmap;
}
}).subscribeOn().observeOn().subscribe(new Observer<Bitmap>() {
@Override
public void onNext(Bitmap bitmap) {
Log.d(TAG, "回调应用层 通知观察者: " + bitmap.toString());
Log.d(TAG, "观察者:" + Thread.currentThread().getName());
}
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
}
});
}
执行结果:
2021-07-06 16:25:11.124 11182-11221/com.test.rxjavademo2 D/abc: Observable--onNext
2021-07-06 16:25:11.124 11182-11221/com.test.rxjavademo2 D/abc: 开始下载文件:http://baidu.com/1.png
2021-07-06 16:25:11.128 11182-11221/com.test.rxjavademo2 D/abc: 下载图片成功: android.graphics.Bitmap@3d56295
2021-07-06 16:25:11.128 11182-11221/com.test.rxjavademo2 D/abc: observerC--onNext t=http://baidu.com/1.png, r=android.graphics.Bitmap@3d56295
2021-07-06 16:25:11.128 11182-11221/com.test.rxjavademo2 D/abc: subscribeOn--onNext
2021-07-06 16:25:11.128 11182-11221/com.test.rxjavademo2 D/abc: 被观察者:Thread-2
2021-07-06 16:25:11.132 11182-11182/com.test.rxjavademo2 D/abc: 回调应用层 通知观察者: android.graphics.Bitmap@3d56295
2021-07-06 16:25:11.132 11182-11182/com.test.rxjavademo2 D/abc: 观察者:main
备注:
-
subscribeOn是通过新建Observable的方式,使用OnSubscribe类的方式去做到线程切换的
subscribeOn()的位置放在哪里都可以,但它是只能调用一次,原因就是subscribeOn是通过新建Onservable的方式 -
observeOn是通过operator操作符的形式去完成线程切换的,所以它的作用域和其他操作符一样,是调用observeOn之后的链路
observeOn()指定的是它之后的操作所在的线程,通过observeOn()的多次调用,程序实现了线程的多次切换