如何在独立于生命周期的类中处理 Observables?

Posted

技术标签:

【中文标题】如何在独立于生命周期的类中处理 Observables?【英文标题】:How to dispose Observables in lifecycle independent classes? 【发布时间】:2019-07-21 23:04:12 【问题描述】:

我有一个基于ConnectivityManager.NetworkCallback 的网络更改通知类,我想在网络可用时更新一些字段;

override fun onAvailable(network: Network?) 
    super.onAvailable(network)
val db = StoreDatabase.getInstance(context)
val stores = db.createStores()

val disposable = stores.insertStore(Stores(storeName = "testOnAvailableNetInsertions", status 
= AppConstants.Database.SYNC_FAIL))
        .subscribeOn(Schedulers.io())
        .observeOn(Schedulers.io()).subscribeWith(object : DisposableCompletableObserver() 
            override fun onComplete() 
                 if (!isDisposed)
                dispose()
            

            override fun onError(e: Throwable) 
                if (!isDisposed)
                    dispose()
            

        ).dispose()

是否可以在方法结束时调用 dispose,或者我必须在其他地方处理该变量, 这就是我的道;

@Insert(onConflict = OnConflictStrategy.REPLACE)
fun insertStore(stores: Stores): Completable 

【问题讨论】:

【参考方案1】:

请注意,您不需要在调用 onCompleteonError 之后显式处理订阅。一旦收到任何终止事件,观察者将被取消订阅。所以你可以尝试的一件事是:

super.onAvailable(network)
val db = StoreDatabase.getInstance(context)
val stores = db.createStores()

stores.insertStore(Stores(storeName="testOnAvailableNetInsertions",
        status=AppConstants.Database.SYNC_FAIL))
    .subscribeOn(Schedulers.io())
    .subscribe()

在链的末尾调用.dispose() 将立即处理订阅,并且在大多数情况下没有多大意义。它可能只适用于您的情况,因为您的订阅者在技术上并没有做太多事情,但我不确定。此外,.dispose() 不返回任何内容。在 Kotlin 中,它将返回 Unit,因此 val disposable 将只是 Unit

【讨论】:

如果是这样,那么我们为什么要在 onDestroy 上清除/处置一次性用品,这件事让我们感觉很尴尬。 @Manoj Perumarath,我们需要明确清除视图层中的可处置对象,因为无法保证所有可观察对象都会在视图被销毁之前完成。 想象一下,即使在 onDestroy 之后订阅者也没有被清除,并试图更新已经在其 onNext 调用中销毁的视图。

以上是关于如何在独立于生命周期的类中处理 Observables?的主要内容,如果未能解决你的问题,请参考以下文章

java如何在一个普通的类中获取request对象

c++类中 各种成员的生命周期?

Android Service概述作用生命周期

react hooks的缺点(针对状态不同步和没有生命周期)

react hooks的缺点(针对状态不同步和没有生命周期)

[译] ASP.NET 生命周期 – ASP.NET 请求生命周期