Android 中的 RxJava:没有生命周期时自动取消订阅

RxJava in Android: Auto unsubscribe from subscription when you don't have a life cycle

我知道当你订阅 Observable 时,你会得到一个订阅,你必须使用 Android 的生命周期取消订阅。 因此,如果在片段或 Activity 中订阅,我会在 onDestroy() 中取消订阅。

但我的问题是当我在没有任何生命周期的地方进行订阅时。例如在 SyncAdapter 中。在这种情况下(或某些情况下)我如何 "auto unsubscribe" 避免内存泄漏? 有没有什么好的做法可以说 "Never subscribe in XXX place" 我在 SyncAdapter 中打破了这个订阅?

我是这样想的:

compositeDisposable.add(
   Observable.just()...
   ...
   .doOnTerminate(compositeDisposable::dispose)
   .subscribe(...)
   );

不仅可以"auto unsubscribe",还可以选择要退订的话题。这是一个非常简单的例子

Observable<Object> source = Observable.using(
() -> {
    System.out.println("Subscribed on " + Thread.currentThread().getId());
    return Arrays.asList(1,2);
},
(ints) -> {
    System.out.println("Producing on " + Thread.currentThread().getId());
    return Observable.from(ints);
},
(ints) -> {
    System.out.println("Unubscribed on " + Thread.currentThread().getId());
}
);

source
.unsubscribeOn(Schedulers.newThread())
.subscribe(System.out::println);

输出应该是

Subscribed on 1
Producing on 1
1
2
Unubscribed on 11

每个CompositeDisaposableDisposableSubscription都可以unsubscribe。但是请确保在 stream 结束时执行此操作。注意 threading.