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
每个CompositeDisaposable
或Disposable
或Subscription
都可以unsubscribe
。但是请确保在 stream
结束时执行此操作。注意 threading
.
我知道当你订阅 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
每个CompositeDisaposable
或Disposable
或Subscription
都可以unsubscribe
。但是请确保在 stream
结束时执行此操作。注意 threading
.