【发布时间】: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