RxJava2的Flowable没有触发onComplete。

3

以下是代码

    private fun setUpDistrictSpinner() {
    commonRepo.getAllDistricts()
            .observeOn(AndroidSchedulers.mainThread())
            .flatMap { list -> Flowable.fromIterable(list) }
            .map { district ->
                districtNameList.add(district.district_name)
                district
            }.subscribe(object:Subscriber<District>{
        override fun onComplete() {
            labSelectionInterface.loadDistricts(districtNameList)
            Timber.d("district List loaded total " + districtList.size)
        }

        override fun onError(t: Throwable?) {
            t!!.printStackTrace()
        }

        override fun onNext(t: District) {
            districtList.add(t)
        }

        override fun onSubscribe(s: Subscription) {
            s.request(Long.MAX_VALUE)
        }
    })

}

在加载区域列表到下拉框中时,onNext方法会被触发,但是onComplete不会被触发,也没有错误信息。我在使用Room数据库和Kotlin。以下是获取Flowable的代码:

    fun getAllDistricts(): Flowable<List<District>> {
    Timber.d("District list accessed")
    return appDatabase.districtDao().getAllDistricts()
            .subscribeOn(Schedulers.io())

}

你是否触发了onComplete?getAllDistricts看起来是什么样子? - Tim
appDatabase.districtDao().getAllDistricts() 是什么? - Tim
@Query("SELECT * from districts") fun getAllDistricts(): Flowable<List<District>> 这是一个Room查询语句,它会返回一个Flowable。 - anil90
1个回答

13

Room返回的Flowable永远不会完成。它允许您在数据库修改时接收更新。

以下是Flowable的行为:

  1. 当数据库中没有用户且查询不返回任何行时,Flowable将不会发出任何事件,不包括onNextonError
  2. 当数据库中存在用户时,Flowable将触发onNext
  3. 每当用户数据更新时,Flowable对象将自动发出事件,从而使您能够根据最新数据更新UI。

如果您想要接收onComplete事件,请切换到Maybe。您应该读一下这篇文章


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接