Android rxjava2的disposable
rxjava+retrofit處理網(wǎng)絡請求
在使用rxjava+retrofit處理網(wǎng)絡請求的時候,一般會采用對觀察者進行封裝,實現(xiàn)代碼復用和拓展。可以參考我的這篇文章:rxjava2+retrofit封裝處理網(wǎng)絡請求全解析。一種可行的封裝如下:
- 基類observer
- 封裝請求(登錄為例) 這里userService是retrofit接口類
- 方法調用
關于disposable
rxjava雖然好用,但是總所周知,容易遭層內存泄漏。也就說在訂閱了事件后沒有及時取閱,導致在activity或者fragment銷毀后仍然占用著內存,無法釋放。而disposable便是這個訂閱事件,可以用來取消訂閱。但是在什么時候取消訂閱呢?我知道有兩種方式:
- 使用CompositeDisposable
看源碼,CompositeDisposable的介紹很簡單
A disposable container that can hold onto multiple other disposables and offers O(1) add and removal complexity.
一個disposable的容器,可以容納多個disposable,添加和去除的復雜度為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銷毀的時候,調用compositeDisposable.dispose()就可以切斷所有訂閱事件,防止內存泄漏。
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后調用disposable.dispose();,也就是上面我給的例子中的方法。
查看源碼,ObservableCreate的靜態(tài)類CreateEmitter就是這種方式實現(xiàn)的。同時也可以看到,onError和onComplete不可以同時調用的原因:每次掉用過onError或onComplete其中一個方法后,就會掉用dispose()方法,此時訂閱取消,自然也就不能掉用另一個方法了
除此之外,在github發(fā)現(xiàn)一個開源庫RxLifecyclee,粗略了解發(fā)現(xiàn)他實現(xiàn)的原理是綁定acvitvity是生命周期,在onStart中綁定就在onStop中解綁,其他onResume,onCreate同理。這個和第一種方式似乎又差不多,只不過第一種方式簡單,只在ondestory的時候銷毀所有事件。
所以那兩種方法哪種更好,我也不是很清楚。等到踩到什么坑了可能就知道了。?
如果某位大佬知道,希望不吝指教。
總結
以上是生活随笔為你收集整理的Android rxjava2的disposable的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 运维管理架构方案
- 下一篇: 教你打造一个Android组件化开发框架