使用rxjava的话 必须要有的四种东西:
Observable(被观察者)
Observer (观察者)
subscribe(订阅)
event(事件)
一个人要看一部连载小说的话,想要最快时间去看最新章节的话,不可能实时去盯着这本书的情况。这种情况下就需要去订阅这本小说,然后在小说那边留下了自己的联系方式,当小说有了新的连载之后,然后小说就会根据订阅的人们留下的联系方式去一一通知,
//创建被观察者 小说 连载过程 在子线程
Observable book = Observable.create(new ObservableOnSubscribe() {
@Override
public void subscribe(ObservableEmitter emitter) throws Exception {
Log.i(TAG, "ThreadName===" + Thread.currentThread().getName());
for (int i = 0; i < 100; i++) {
emitter.onNext("连载" + i);
Thread.sleep(100);
}
emitter.onComplete();
}
});
//创建观察者 读书的人 在主线程
Observer reader = new Observer() {
private Disposable d;
@Override
public void onSubscribe(Disposable d) {
this.d = d;
compositeDisposable.add(this.d);
Log.e(TAG, "onSubscribe");
}
@Override
public void onNext(String value) {
Log.e(TAG, "收到了连载的通知:" + value);
}
@Override
public void onError(Throwable e) {
Log.e(TAG, "onError=" + e.getMessage());
}
@Override
public void onComplete() {
Log.e(TAG, "收到了完结的通知:");
}
};
book.subscribeOn(Schedulers.io()) //连载的过程 ====执行在io线程
.observeOn(AndroidSchedulers.mainThread())//发生变化 通知读书的人======回调在主线程
.subscribe(reader);//开始的订阅
通过上面的代码就简单的模拟了一次读者看连载小说的过程,下面我就通过上面的代码进行讲解
被观察者Observable也就是上面的小说
观察者Observer 也就是读者。
订阅subscribe方法去完成订阅的行为。
事件event连载事件的发送 ObservableEmitter.onNext()
book.subscribe(reader) 从意思上面来看的话 是小说订阅了读者 ,有点不太好通顺,我觉得应该是为了维护链式编程的原因,你可以这样理解 小说被读者订阅了,这样就会好理解一点。
Rxjava还有另外一个比喻,就是用上游来定义被观察者 下游代表观察者
rxjava的所有事件都是由ObservableEmitter发出去的,字面上理解的话就是发射器,有三种事件类型onNext、onComplete、onError。
下面的东西可能有点复杂,不太容易理解,我会接着用上面小说的例子来进行讲解。你订阅了这本小说之后,小说可能会给你发送连载消息(onNext)、完结消息(onComplete)、垃圾消息(onError)。
解释:也就是只要这本小说不完结, 你可以一直收到连载的消息。
解释:有一天你收到了小说完结的消息并且看完了(看完最后一章的心情是很爽的!!!)但是另外一个人看这本小说很受欢迎,然后就开始写番外篇,然后接着给你发送连载消息或者垃圾信息,你都已经看完了,肯定不会再去关注他了。
解释:就是说这本小说可以一直不完结,而且也不用给你发垃圾信息
解释:收到完结消息和垃圾消息之后,我就会对这个小说做一个标记,认为就是已经没有用了,然后这个时候如果给我发送了完结消息的话,我也不会关心。但是我收到完结消息或者垃圾信息,如果小说再给我发垃圾消息的话,我就会举报这本小说(也就是会有crash)还有就是只要发送过一次垃圾信息之后,小说再给我发送完结消息的话 我也会认为是垃圾信息。
上面的代码还涉及到一个线程切换的过程,也就是小说的连载过程是用你自己的时间去处理的,不能影响到读者的时间。所以小说的连载过程(subscribe)是发生在子线程中的,然后最终得到通知的读者处理(onNext,onComplete,onError)是自己主线程中的,那么这两种操作运行的线程是在哪里指定的?就是上面的代码
book.subscribeOn(Schedulers.io()) //连载的过程 ====执行在io线程
.observeOn(AndroidSchedulers.mainThread())//发生变化 通知读书的人======回调在主线程
.subscribe(reader);//开始的订阅
关于这两个函数,还有一点说明:多次调用subscribeOn,会以第一次的为准;多次而调用observeOn则会以求最后一次的为准。====
上面还有一个问题,就是如果说我觉得看这个小说没意思了,然后不想看了,小说还会给我一直推送消息,这也就是我们遇到的内存泄漏的原因。那么应该怎么解决呢?我们可以去退订,将留在小说那的联系方式进行注销就好了。下面通过代码来讲解:
Rxjava会为每一个Observer生成一个Disposable(联系方式)进行管理,RxJava提供了一个CompositeDisposable类用于管理这些Disposable,我们只需要将其将入到该集合当中,在Activity的onDestroy方法中,它调用的clear方法,就能避免内存泄漏的发生。
private CompositeDisposable compositeDisposable = new CompositeDisposable();
然后在上面代码的20行的时候通过调用compositeDisposable .add方法添加,然后在合适的时机调用compositeDisposable .clear就可以了。