首页 > 解决方案 > 如何在独立于生命周期的类中处理 Observables?

问题描述

我有一个基于网络更改通知程序的类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 

标签: androidobservablerx-java2android-roomandroid-connectivitymanager

解决方案


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

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 中,它会返回 a Unit,所以它val disposable只是 a Unit


推荐阅读