如何监控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
相关产品推荐
相关产品推荐

