【问题标题】:Operator "concat" does not work properly. Kotlin+RxJava运算符“concat”无法正常工作。 Kotlin+RxJava
【发布时间】:2019-01-21 16:45:49
【问题描述】:

全部!我想首先在数据库中获取数据,如果数据库为空,则调用服务器。但是当我使用这种方式时,我没有任何反应。我一开始尝试调用服务器,它成功了。怎么了???这是我的代码:

private fun getDataFromRepository() {
    val subscription =
        carRepository.getCars()!!.
            subscribeOn(Schedulers.io()).
                observeOn(AndroidSchedulers.mainThread()).
            subscribe(
            { cars ->
                LOG.info(cars.size.toString())
                    carRepository.saveCarsInDB(cars)
                data.postValue(cars)
            },
            { e ->
                    loadError.postValue(e.toString())
                    LOG.warning(e.toString())
            })
    subscriptions.add(subscription)
}

流动性:

fun getCars(): Single<List<Car>>? {
    val db = getDataFromDB()
    val server = getDataFromServerFlowable()
    val mock = getDataFromMock()

    return Flowable.concat(db, server).first(mock)
}

private fun getDataFromServerFlowable(): Flowable<List<Car>> {
    return carApi.getPostsFlowable()
}

private fun getDataFromDB(): Flowable<List<Car>> {
    return RealmCar().queryAllAsFlowable() //"com.github.vicpinm:krealmextensions:2.4.0" 
        .map { cars -> mapper.convertListRealmCarToListCar(cars) }
        .filter { car -> car.isNotEmpty()}
}

private fun getDataFromMock(): List<Car> {
    val cars: MutableList<Car> = mutableListOf()
    val car = Car(0, 0, "Test", "Test", "Test")
    cars.add(car)
    return cars
}

服务器调用:

@GET("/photos")
fun getPostsFlowable(): Flowable<List<Car>>

【问题讨论】:

  • 不清楚getDataFromRepository 的含义是什么,你没有返回任何东西,只是data.postValue(cars)(也不清楚你在用它做什么)
  • 这是 MVVM 模式。对这个案子没关系。因为我想在这个街区有车。
  • 如果代码不相关,请将其删除,这会使尝试帮助您的人变得更加困难
  • 我只是一般不会使用com.github.vicpinm:krealmextensions 库,这很糟糕。

标签: kotlin realm retrofit2 rx-java2


【解决方案1】:

根据您的逻辑,您应该考虑使用merge 而不是concat 来交错元素。在您的情况下,getDataFromDB() 没有发出,所以最终的Flowable 在发出getDataFromServerFlowable() 之前正在等待它,merge vs concat 有很多好的答案(即this one

【讨论】:

  • 但是“合并”是合并来自两个 Observable 的数据。因此,如果两个来源有数据,我会得到比我需要的更多的数据。我只想拥有一条数据。
  • 然后merge 然后take(1),这样你只会得到第一个发出的
  • @DenisFedak 顺便说一句,如果Flowable 都发出了,concat 你也会有两个元素
猜你喜欢
  • 2015-11-27
  • 2015-04-25
  • 1970-01-01
  • 2016-10-06
  • 1970-01-01
  • 1970-01-01
  • 2021-02-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多