關(guān)于disposable
Disposable類
- dispose():主動(dòng)解除訂閱
- isDisposed():查詢是否解除訂閱 true 代表 已經(jīng)解除訂閱
rxjava雖然好用,但是總所周知书在,容易遭層內(nèi)存泄漏仇箱。也就說在訂閱了事件后沒有及時(shí)取閱醉旦,導(dǎo)致在activity或者fragment銷毀后仍然占用著內(nèi)存裁眯,無法釋放膘流。而disposable便是這個(gè)訂閱事件湿蛔,可以用來取消訂閱棋嘲。但是在什么時(shí)候取消訂閱呢?我知道有兩種方式:
- 使用CompositeDisposable
看源碼叁熔,CompositeDisposable的介紹很簡單
A disposable container that can hold onto multiple other disposables and offers O(1) add and removal complexity.
一個(gè)disposable的容器委乌,可以容納多個(gè)disposable,添加和去除的復(fù)雜度為O(1)荣回。
這里需要注意的是在該類的addAll方法有這么一句注釋
Atomically adds the given array of Disposables to the container or disposes them all if the container has been disposed
也就是說遭贸,如果這個(gè)CompositeDisposable容器已經(jīng)是處于dispose的狀態(tài),那么所有加進(jìn)來的disposable都會(huì)被自動(dòng)切斷心软。
所以說可以創(chuàng)建一個(gè)BaseActivity壕吹,用CompositeDisposable來管理訂閱事件disposable,然后在acivity銷毀的時(shí)候删铃,調(diào)用compositeDisposable.dispose()就可以切斷所有訂閱事件耳贬,防止內(nèi)存泄漏。
CompositeDisposable類
1猎唁、可以快速解除所有添加的Disposable類.
2咒劲、每當(dāng)我們得到一個(gè)Disposable時(shí)就調(diào)用CompositeDisposable.add()將它添加到容器中, 在退出的時(shí)候, 調(diào)用CompositeDisposable.clear() 即可快速解除.
案例代碼如下:
CompositeDisposable compositeDisposable=new CompositeDisposable();
Observable.create(new ObservableOnSubscribe<Integer>() {
@Override
public void subscribe(ObservableEmitter<Integer> emitter) throws Exception {
emitter.onNext(1);
emitter.onComplete();或者 emitter.onError(new Throwable("O__O "));
}
}).subscribe(new Observer<Integer>() {
private Disposable mDisposable;
@Override
public void onSubscribe(Disposable d) {
<!-- 訂閱 -->
mDisposable = d;
<!-- 添加到容器中 -->
compositeDisposable.add(d);
}
@Override
public void onNext(Integer value) {
<!-- 判斷mDisposable.isDisposed()如果解除了則不需要處理 -->
}
@Override
public void onError(Throwable e) {
}
@Override
public void onComplete() {
}
});
<!-- 解除所有訂閱者 -->
compositeDisposable.clear();
- 在oError和onComplete后調(diào)用disposable.dispose();,也就是上面我給的例子中的方法诫隅。
查看源碼腐魂,ObservableCreate的靜態(tài)類CreateEmitter就是這種方式實(shí)現(xiàn)的。同時(shí)也可以看到逐纬,onError和onComplete不可以同時(shí)調(diào)用的原因:每次掉用過onError或onComplete其中一個(gè)方法后蛔屹,就會(huì)掉用dispose()方法,此時(shí)訂閱取消豁生,自然也就不能掉用另一個(gè)方法了
new Observer<Integer>() {
private Disposable mDisposable;
private int i;
@Override
public void onSubscribe(Disposable d) {
Log.d(TAG, "subscribe");
mDisposable = d;
}
@Override
public void onNext(Integer value) {
Log.d(TAG, "onNext: " + value);
i++;
if (i == 2) {
Log.d(TAG, "dispose");
mDisposable.dispose();
Log.d(TAG, "isDisposed : " + mDisposable.isDisposed());
}
}
@Override
public void onError(Throwable e) {
Log.d(TAG, "error");
}
@Override
public void onComplete() {
Log.d(TAG, "complete");
}
}