当前位置: 首页 > 知识库问答 >
问题:

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

邵伟
2023-03-14

我知道当您订阅可观察时,您会收到一个必须使用Android生命周期取消订阅的订阅。因此,对于片段或活动中的订阅,我使用onDestroy()中的取消订阅。

但我的问题是,当我在没有任何生命周期的地方订阅时。例如,在SyncAdapter中。在这种情况下,我如何“自动取消订阅”以避免内存泄漏?在SyncAdapter中,有没有什么好的做法,比如说“永远不要在XXX位置订阅”,而我正在打破这种订阅?

我是这样想的:

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

共有1个答案

薛焱
2023-03-14

您不仅可以“自动取消订阅”,还可以选择要取消订阅的线程。这是一个非常简单的例子

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

每个可组合的一次性的订阅都可以取消订阅。但请确保在流结束时执行此操作。注意线程问题。

 类似资料:
  • 我为测试函数做了简单的应用程序,如onCreate()、onStart等。每个函数都让你有自己的日志。开始测试。 null 为什么在执行应用程序时调用onResume方法?(在a中) 为什么onPause和onStop方法一起调用?(在b中) 为什么在C中调用三个方法而不是onRestart或onrestume?(c) 为什么调用onDestroy方法?(d) 附言:对不起,英语:)

  • 所以,我有一个组件 问题是,一旦组件被销毁,订阅是否仍然有效,或者Angular/RxJS是否足够聪明,可以自动取消订阅?

  • 我刚刚开始学习RxJava/RxAndroid。我想避免上下文泄漏,所以我创建了一个BaseFragment,如下所示: 在我的扩展BaseFraank的片段中,我正在这样做: 所以我想我的问题有两个: > 这会因为我取消订阅onDestroy()而停止上下文泄漏吗? 我是否通过在完成后将订阅设置为null并检查null来正确跟踪可观察对象是否正在“运行”?

  • 本文向大家介绍Android活动生命周期介绍,包括了Android活动生命周期介绍的使用技巧和注意事项,需要的朋友参考一下 示例 假定具有MainActivity的应用程序可以通过单击按钮来调用Next Activity。 和 在首次创建应用程序 d / MainActivity:从主叫MainActivity的onCreate d / MainActivity:从主叫MainActivity调用

  • 本文向大家介绍Android Service生命周期?相关面试题,主要包含被问及Android Service生命周期?时的应答技巧和注意事项,需要的朋友参考一下 onCreate() 首次创建服务时,系统将调用此方法。如果服务已在运行,则不会调用此方法,该方法只调用一次。 onStartCommand() 当另一个组件通过调用startService()请求启动服务时,系统将调用此方法。 onD

  • 本文向大家介绍Android 服务的生命周期,包括了Android 服务的生命周期的使用技巧和注意事项,需要的朋友参考一下 示例 服务生命周期具有以下回调 onCreate() : 在首次创建服务以设置您可能需要的初始配置时执行。仅在服务尚未运行时才执行此方法。 onStartCommand() : 每次执行startService()都由另一个组件(例如Activity或BroadcastRec