Rxjava2的CompositeDisposable

文章讲述了项目中遇到的未登录时请求需登录接口的问题,发现`dispose()`函数在接口返回201后执行,导致登录后无法请求。解决方法包括过滤`dispose()`或在适当情况下使用`clear()`方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近,项目中遇到了一个历史遗留问题:未登录状态请求需要登录的接口,接口返回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);
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值