Android rxjava2的disposable
rxjava+retrofit處理網(wǎng)絡(luò)請求
在使用rxjava+retrofit處理網(wǎng)絡(luò)請求的時候,一般會采用對觀察者進行封裝,實現(xiàn)代碼復(fù)用和拓展。可以參考我的這篇文章:rxjava2+retrofit封裝處理網(wǎng)絡(luò)請求全解析。一種可行的封裝如下:
- 基類observer
- 封裝請求(登錄為例) 這里userService是retrofit接口類
- 方法調(diào)用
關(guān)于disposable
rxjava雖然好用,但是總所周知,容易遭層內(nèi)存泄漏。也就說在訂閱了事件后沒有及時取閱,導(dǎo)致在activity或者fragment銷毀后仍然占用著內(nèi)存,無法釋放。而disposable便是這個訂閱事件,可以用來取消訂閱。但是在什么時候取消訂閱呢?我知道有兩種方式:
- 使用CompositeDisposable
看源碼,CompositeDisposable的介紹很簡單
A disposable container that can hold onto multiple other disposables and offers O(1) add and removal complexity.
一個disposable的容器,可以容納多個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
也就是說,如果這個CompositeDisposable容器已經(jīng)是處于dispose的狀態(tài),那么所有加進來的disposable都會被自動切斷。
所以說可以創(chuàng)建一個BaseActivity,用CompositeDisposable來管理訂閱事件disposable,然后在acivity銷毀的時候,調(diào)用compositeDisposable.dispose()就可以切斷所有訂閱事件,防止內(nèi)存泄漏。
static final class CreateEmitter<T> implements ObservableEmitter<T>, Disposable {private static final long serialVersionUID = -3434801548987643227L;final Observer<? super T> observer;CreateEmitter(Observer<? super T> observer) {this.observer = observer;}@Overridepublic void onNext(T t) {if (t == null) {onError(new NullPointerException("onNext called with null. Null values are generally not allowed in 2.x operators and sources."));return;}if (!isDisposed()) {observer.onNext(t);}}@Overridepublic void onError(Throwable t) {if (t == null) {t = new NullPointerException("onError called with null. Null values are generally not allowed in 2.x operators and sources.");}if (!isDisposed()) {try {observer.onError(t);} finally {dispose();}} else {RxJavaPlugins.onError(t);}}@Overridepublic void onComplete() {if (!isDisposed()) {try {observer.onComplete();} finally {dispose();}}}@Overridepublic void setDisposable(Disposable d) {DisposableHelper.set(this, d);}@Overridepublic void setCancellable(Cancellable c) {setDisposable(new CancellableDisposable(c));}@Overridepublic ObservableEmitter<T> serialize() {return new SerializedEmitter<T>(this);}@Overridepublic void dispose() {DisposableHelper.dispose(this);}@Overridepublic boolean isDisposed() {return DisposableHelper.isDisposed(get());} }- 在oError和onComplete后調(diào)用disposable.dispose();,也就是上面我給的例子中的方法。
查看源碼,ObservableCreate的靜態(tài)類CreateEmitter就是這種方式實現(xiàn)的。同時也可以看到,onError和onComplete不可以同時調(diào)用的原因:每次掉用過onError或onComplete其中一個方法后,就會掉用dispose()方法,此時訂閱取消,自然也就不能掉用另一個方法了
除此之外,在github發(fā)現(xiàn)一個開源庫RxLifecyclee,粗略了解發(fā)現(xiàn)他實現(xiàn)的原理是綁定acvitvity是生命周期,在onStart中綁定就在onStop中解綁,其他onResume,onCreate同理。這個和第一種方式似乎又差不多,只不過第一種方式簡單,只在ondestory的時候銷毀所有事件。
所以那兩種方法哪種更好,我也不是很清楚。等到踩到什么坑了可能就知道了。?
如果某位大佬知道,希望不吝指教。
總結(jié)
以上是生活随笔為你收集整理的Android rxjava2的disposable的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 运维管理架构方案
- 下一篇: 脑残式网络编程入门(三):HTTP协议必