【问题标题】:cannot resolve the defined Disposable无法解析定义的 Disposable
【发布时间】:2021-05-06 21:41:57
【问题描述】:

有一个函数从数据库中查询数据并返回一个Flowable

       @Dao
        interface DataDao {
            @Query("SELECT * FROM DataTable ORDER BY `order`")
            fun listenToAll():Flowable<List<DataRoomEntity>>
        }

当订阅它时,disposable 没有被解析(见截图)。

        var dataDao: DataDao
        fun listenToDataDb(): Flowable<Data> = dataDao.listenToAll()
                .map { convertEntitiesToData(it) }

        fun getData(){
            //var disposable: Disposable? = null
            var disposable = listenToDataDb()
                    .subscribe({ data ->
                            // do something with data
                            disposable?.dispose() //<== disposable is unresolved
            }, { throwable ->
                    disposable?.dispose(). //<== disposable is unresolved
            })
        }
    }

但如果先定义 var disposable: Disposable = null 就可以了

fun test(){
            var disposable: Disposable? = null
            disposable = listenToDataDb()
                    .subscribe({ data ->
                            // do something with data
                            disposable?.dispose() //<=== it is fine
            }, { throwable ->
                    disposable?.dispose()
            })
        }

如果不先定义,为什么会出现unresolved 错误?

【问题讨论】:

  • 没有理由以这种方式从订阅回调中调用 dispose。如果您只需要查询中的一些而不是全部,请使用 take() 来限制结果量。
  • 感谢@akamokd!据说订阅完成时它应该总是调用 Disposable.dispose(),并且他们中的大多数建议在 onDetroy() 或.autoDispose(LifecycleOwner.scope()) 中执行它,但这里它不在片段/活动中并且没有访问 lifeCycleOwner。因此,请考虑在订阅的 callbak 中执行此操作,以避免潜在的泄漏或意外行为。

标签: android rx-java2 disposable


【解决方案1】:

Disposable 是 Observable 和 Observer 之间的流或链接。您可以像下面这样全局声明

       lateinit var disposable: Disposable

然后

       if(!disposable.isDisposed){
         disposable.dispose()
        }

【讨论】:

  • 谢谢!你介意评论一下是否在 .subscribe() 的回调中调用一次性的?.dispose() 可以吗?在这里调用它的地方无法访问上下文,无法访问活动/片段,没有 viewModel,因此无法调用 .autoDispose(viewLifecycleOwner.scope())。或者有什么替代方法?
  • @lannyf When an Observable issues an OnError or OnComplete notification to its observers, this ends the subscription. Observers do not need to issue an Unsubscribe notification to end the subscriptions that are ended by the Observable in this way. 阅读medium.com/@vanniktech/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-14
  • 2018-06-07
  • 1970-01-01
  • 2013-02-20
相关资源
最近更新 更多