最近,项目中遇到了一个历史遗留问题:未登录状态请求需要登录的接口,接口返回201之后,再次登录,刷新无法请求接口的问题。
于是,经过一些类深入排查。发现:在项目基建的网络请求框架中,
接口请求中返回201之后,这里代码会直接两个命令,一个是dispose(),另一个是needLogin()。
其中,201表示尚未登录,needLogin()则会执行调整到登录页面进行登录的相关操作。
而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<Disposable> set;synchronized (this) {if (disposed) {return;}set = resources;resources = null;}dispose(set);}