【问题标题】:Should I dispose disposables in a Singleton class ( Android RxJava 2 )我应该在 Singleton 类中处理一次性用品吗(Android RxJava 2)
【发布时间】:2018-07-23 08:56:50
【问题描述】:

当我 subscribe({}) 到 Singleton 类中的 Observable 时,我是否需要在某个时候调用 .dispose() 方法?如果是,何时何地?因为在应用程序运行之前,单身人士将一直存在。 像这样(Kotlin):

@Singleton
class MySingletonClass @Inject constructor(
    private val api: MyAPIManager
) {

fun fetchData() {

        //subscribed inside the Singleton
        api.service.getSomeDataFromAPI()
        .toRxObservable()
        .subscribeOn(Schedulers.io())
        .observeOn(AndroidSchedulers.mainThread())
        .subscribe({ 
                   //do something internally with response
                   },
                   {
                   //handle error internally
                   })

}

subscribe() 方法返回一个Disposable

我的主要问题是:我需要打电话给dispose() 吗?因为我认为我只能在应用程序完成或杀死时调用它,这不是必需的。

【问题讨论】:

    标签: android rx-java2 dagger-2


    【解决方案1】:

    这里(可能)更大的担忧是您的单例在 Android 组件的生命周期之外工作。如果您的单例是静态的或由您的Application 托管,那么当您的应用程序在后台时,它可能会突然终止。如果这不是问题,那么您的问题的答案是不,您不需要处置您的订阅。但是,您仍然应该警惕在您的应用程序在后台运行时进行工作,除非用户期望它。 (如果他们这样做,它可能应该在Service 中或按计划运行。)Application 和 VM 可以在用户感知应用程序“关闭”后持续很长时间,并且过多的资源消耗可能导致差评和卸载。

    【讨论】:

      【解决方案2】:

      你可以使用优步的autoDispose lib

          myObservable 
      .doStuff() 
      .as(autoDisposable(this)) // The magic 
      .subscribe(s -> ...);
      

      【讨论】:

      • 那么“魔法”中的this 是什么?单例不是生命周期的提供者,也不应该是单例(在组件实例的上下文中)。一旦订阅完成,即onCompleteonError,它无论如何都会释放任何资源。我建议在回答图书馆链接之前,您先了解您要复制/粘贴的内容作为答案,并给出完整的解决方案,而不是错误的解决方案。
      • 你可以给生命周期所有者作为参数你知道吗 Mark:)
      • 你知道讽刺是最底层的智慧。我认为你实际上不能为你的答案辩护。
      【解决方案3】:

      是的,通常我把它放在presenter的stop函数中,在onStop()activity方法中调用

      【讨论】:

      • 但是这里我没有订阅一个Activity,它只是订阅了Singleton本身
      • 回答你的主要问题是为什么不))?因为如果您不取消订阅单例类,您将有内存泄漏。我说的对吗?))
      • 我不确定,但我认为内存泄漏只会发生在活动和片段上,因为实际上,它发生在您订阅观察者时,然后在得到观察者的响应之前,完成活动或片段但是因为你订阅了一个观察者,它保留了一个活动或片段的引用,然后就会发生内存泄漏! (如果用户再次打开该活动,android 会为该活动创建一个新实例,但Java Garbage Collector 不收集旧活动,因为在观察者中仍然存在对旧活动的引用),但这个故事不可能发生单身人士。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-13
      • 2016-09-05
      • 2014-09-06
      相关资源
      最近更新 更多