You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何监控Observable的Observer取消订阅(System.Reactive)

Observable订阅释放时获取通知的简便方法

1. 直接使用do系列操作符(最简便)

这是Rx系列库(RxJava/RxSwift等)原生支持的方式,无需额外封装,直接在Observable链中添加对应操作符监听释放事件:

RxSwift 示例:

let subscription = yourObservable
    .do(onDispose: {
        // 这里添加释放时的逻辑,比如打印日志或触发断点
        print("订阅已被释放")
        // 直接在这行代码上设置断点即可
    })
    .subscribe(onNext: { value in
        // 处理正常事件逻辑
    })

RxJava 示例:

Disposable disposable = yourObservable
    .doOnDispose(() -> {
        // 订阅释放时执行的逻辑
        System.out.println("订阅已被释放");
        // 在该回调内设置断点
    })
    .subscribe(value -> {
        // 处理事件
    });

2. 自定义可通知的Disposable(复用场景)

如果需要在多个地方复用释放通知逻辑,可以封装一个自定义Disposable类,包装原始订阅的Disposable:

RxJava 自定义实现:

public class NotifiableDisposable implements Disposable {
    private final Disposable originalDisposable;
    private final Runnable onDisposeCallback;

    public NotifiableDisposable(Disposable original, Runnable callback) {
        this.originalDisposable = original;
        this.onDisposeCallback = callback;
    }

    @Override
    public void dispose() {
        originalDisposable.dispose();
        onDisposeCallback.run();
    }

    @Override
    public boolean isDisposed() {
        return originalDisposable.isDisposed();
    }
}

// 使用方式
Disposable original = yourObservable.subscribe(value -> { /* 处理事件 */ });
Disposable notifiable = new NotifiableDisposable(original, () -> {
    // 释放通知逻辑
    System.out.println("订阅已释放");
});

RxSwift 自定义实现:

class NotifiableDisposable: Disposable {
    private let originalDisposable: Disposable
    private let onDispose: () -> Void

    init(original: Disposable, onDispose: @escaping () -> Void) {
        self.originalDisposable = original
        self.onDispose = onDispose
    }

    func dispose() {
        originalDisposable.dispose()
        onDispose()
    }
}

// 使用方式
let original = yourObservable.subscribe(onNext: { value in /* 处理事件 */ })
let notifiable = NotifiableDisposable(original: original) {
    print("订阅已释放")
}

3. 手动组合Disposable(RxSwift专属)

RxSwift中可以直接用Disposables.create将原始订阅的释放逻辑和自定义通知逻辑合并:

let originalSubscription = yourObservable.subscribe(onNext: { value in
    // 处理事件
})
let notifiableSubscription = Disposables.create {
    originalSubscription.dispose()
    print("订阅已释放")
    // 触发断点
}
// 后续只需管理notifiableSubscription即可

内容的提问来源于stack exchange,提问作者SuperJMN

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 06:31:21