Rxjava2的CompositeDisposable

最近,项目中遇到了一个历史遗留问题:未登录状态请求需要登录的接口,接口返回201之后,再次登录,刷新无法请求接口的问题。
于是,经过一些类深入排查。发现:在项目基建的网络请求框架中,
接口请求中返回201之后,这里代码会直接两个命令,一个是dispose(),另一个是needLogin()。
其中,201表示尚未登录,needLogin()则会执行调整到登录页面进行登录的相关操作。
Rxjava2的CompositeDisposable_第1张图片

而dispose()。继续深入排查,它会执行代码:

mCompositeDisposable.dispose()

CompositeDisposable : 一种一次性容器,可以容纳多个其他一次性物品,并提供O(1)添加和移除的复杂性。
在使用rxjava的过程中,会使用CompositeDisposable来添加事件。

**
 * A disposable container that can hold onto multiple other disposables and
 * offers O(1) add and removal complexity.
 */
public final class CompositeDisposable implements Disposable, DisposableContainer {
//...
}

而它所执行的disposed可以看截图,dispose会调用到右边框出来的这段源码,源码中,会将标志位disposed异步设置为true。
设置为true之后,会拦截接下来新添加进来的disposable。所以重新登录的时候才会导致无法请求到接口。

因此,如果不希望被拦截的话,则需要在这种场景下,将而dispose()过滤掉。
或者,如果在判断已经处理好了登录状态或者其他异常状态的情况下,执行clear()方法,替换掉dispose即可。

需要留意的是,clear方法,会处理掉以前包含的所有Disposables。

 public void clear() {
        if (disposed) {
            return;
        }
        OpenHashSet set;
        synchronized (this) {
            if (disposed) {
                return;
            }

            set = resources;
            resources = null;
        }

        dispose(set);
    }

你可能感兴趣的:(#,Android——SDK,Android,android,rxjava)