-
map和flatMap的区别,flatMap可以自己分发多个数据给下面 juejin.cn/post/684490…
-
RxJava全局Hook
RxJavaPlugins
全局操作符打印,全局线程监听什么的,以下是全局错误处理:
RxJavaPlugins.setErrorHandler(Consumer { LogUtil.d("RxJavaError:${it.message}") }) -
RxJava线程变换
Android主线程是通过Handler(真正的操作包装在Message中)
子线程是通过线程池(真正的操作包装成Runnable中)
流程:
-
Scheduler调度者,传入不同的Scheduler来使用不同的线程
-
用Scheduler创建Work(内部类)来使用真正的线程池
-
传入具体的操作包装成Runnable
-
通过schedule方法来实现调度,worker.schedule
-

-
doSubscribeOn
doOnSubscribe 在哪个线程调用,就在那个线程,也可切换到其他线程,代码如下:
.doOnSubscribe(new Consumer<Disposable>() {
@Override
public void accept(Disposable disposable) throws Exception {
System.out.println("==========jackie===doOnSubscribe======="+Thread.currentThread().getName());
}
})
.subscribeOn(Schedulers.io())
//System.out: ==========jackie===doOnSubscribe=======RxCachedThreadScheduler-1
-
Map转换流程
Observable通过map()后返回一个ObservableMap,同时也会创建一个MapObserver(里面包装了Observer),调用订阅susbcribe()方法后,ObservableMap.onNext()-> apply()数据转换 -> Observer.onNext()
如果有两个Map转换,流程
Observable通过map()后返回一个ObservableMap1,同时也会创建一个MapObserver1(里面包装了Observer),又map()后返回一个ObservableMap2,同时也会创建一个MapObserver2(里面包装了MapObserver1),调用订阅susbcribe()方法后,MapObservaber1.onNext()-> apply1()数据转换 -> MapObservaber2.onNext()-> apply2()数据转换 -> Observer.onNext()
onNext()方法里面有apply方法

代码的执行顺序一定是这样的,虽然MapObservaber2包裹着MapObserver1,但是MapObservaber1的onNext是先执行的,然后才是MapObservaber2的onNext(),然后才是原始的Observer的onNext
代码细节不重要,包装流程一定要清楚,不同Observer的onNext执行顺序要讲清楚,apply方法的执行顺序要讲清楚。
-
自己实现一个类似RxJava的观察者模式
public interface Action1<T> { void call(T t); }public interface Callee<T> { void onNext(T t); void onError(Throwable t); void onComplete(); }public class Caller<T> { final OnCall<T> mOnCall; public Caller(OnCall<T> onCall){ this.mOnCall = onCall; } public static <T> Caller<T> create(OnCall<T> onCall){ return new Caller(onCall); } public Calling call(Receiver receiver){ this.mOnCall.call(receiver); return receiver; } public interface OnCall<T> extends Action1<Receiver<T>>{ } }public interface Calling { void unCall(); boolean isUnCalled(); }public abstract class Receiver<T> implements Callee<T>,Calling{ @Override public boolean isUnCalled() { return false; } @Override public void unCall() { } }实际调用:
Receiver<String> receiver = new Receiver<String>() { @Override public void onNext(String o) { } @Override public void onError(Throwable t) { } @Override public void onComplete() { } }; Caller.OnCall onCall = new Caller.OnCall<String>() { @Override public void call(Receiver<String> stringReceiver) { stringReceiver.onNext("123"); } }; //其实就是传进去一个实例,然后调用stringReceiver.onNext(Object o),具体的实现类中拿到值 Calling calling = Caller.create(onCall).call(receiver);
类图关系如下:

-
CreateEmitter数据处理器,本质是对Observer和Subscribe的包装
-
compose操作符,可以封装一下线程变换的操作
-
背压Flowable操作,需要响应式拉取,s.requeset(Long.MAX_VALUE)
-
RxJava的Single,Completable以及Maybe
类型 描述 Observable 能够发射0或n个数据,并以成功或错误事件终止。 Flowable 能够发射0或n个数据,并以成功或错误事件终止。 支持Backpressure,可以控制数据源发射的速度。 Single Single只能发射单个数据或错误事件
Single中SingleObserver只有onSuccess,onError,并没有onComplete。这是Single跟其他的四种被观察者的最大区别。
Single可以通过toXXX方法转换成Observable、Flowable、Completable以及MaybeCompletable 它从来不发射数据,只处理 onComplete 和 onError 事件。可以看成是Rx的Runnable。 Maybe 能够发射0或者1个数据,要么成功,要么失败。有点类似于Optional Completable
Completable.fromAction(new Action() { @Override public void run() throws Exception { System.out.println("Hello World"); } }).subscribe(); //Completable经常会结合andThen操作符 Completable.create(new CompletableOnSubscribe() { @Override public void subscribe(@NonNull CompletableEmitter emitter) throws Exception { try { TimeUnit.SECONDS.sleep(1); emitter.onComplete(); } catch (InterruptedException e) { emitter.onError(e); } } }).andThen(Observable.range(1, 10)) .subscribe(new Consumer<Integer>() { @Override public void accept(@NonNull Integer integer) throws Exception { System.out.println(integer); } });
参考文章: