类型不匹配,返回带有fromCallable的可观察对象

时间:2019-06-03 11:45:07

标签: android kotlin rx-java

以下代码无法编译:

override fun storeConnections(connections: List<Connection>): Observable<List<Connection>> =
    Observable.fromCallable<List<Connection>> {
        appDao.storeConnections(connections.map {
                            mapper.toDb(it)})


    }

appDao.storeConnections行指示以下错误:

  

必填列表!

     

成立单位

storeConnections是使用Room完成的:

@Dao
interface RoomDao {
    @Insert(onConflict = REPLACE)
    fun storeConnections(linkedInConnection: List<LinkedInConnectionEntity>)

}

从我的rx流中调用storeConnections:

val startPositions = BehaviorSubject.createDefault(0)

startPositions.flatMap { startPos -> App.context.repository.getConnections(startPos) }
    .flatMap { connections -> Observable.fromCallable(App.context.repository.storeConnections(connections)) }
    .doOnNext { ind -> startPositions.onNext(ind + 1) }
    .subscribe({ ind -> println("Index $ind") })

如何正确实现fromCallable?

2 个答案:

答案 0 :(得分:0)

回答您的问题:

  

storeConnections不返回任何内容。但是我需要将其包装在一个可观察的物体中,以便将其推向下游。所以也许我的问题是,当该api调用什么都不返回时,如何用Observable包装该API调用。

我将回答如何将其包装在可观察的物体中以将其推入下游:

        .flatMap {
                connections -> 
                    App.context.repository.storeConnections(connections)
                        .andThen(Observable.just(connections))
        }

鉴于storeConnections返回一个Completable:

    override fun storeConnections(connections: List<Connection>): Completable =
        Completable.fromAction {
            appDao.storeConnections(connections.map { mapper.toDb(it) } )
        }
    }

如果storeConnections返回“ nothing”,则只需将Completable.fromAction移动到流中即可。

        .flatMap {
                connections -> 
                    Completable.fromAction { App.context.repository.storeConnections(connections) }
                        .andThen(Observable.just(connections))
        }

答案 1 :(得分:-1)

使其正常工作的关键是使用以下方法:

return@fromCallable connections

这是正确的代码:

override fun storeConnections(connections: List<Connection>): Observable<List<Connection>> =
    Observable.fromCallable<List<Connection>> {

        appDao.storeConnections(connections.map {
            mapper.toDb(it)
        })

        return@fromCallable connections
    }

以及调用它的rx流:

val startPositions = BehaviorSubject.createDefault(0)

    startPositions.flatMap { startPos -> App.context.repository.getConnections(startPos) }
        .flatMap {
                connections -> App.context.repository.storeConnections(connections)
        }
        .doOnNext {
                connections -> startPositions.onNext(startPos++)
        }
        .subscribe({ ind -> println("Index $ind") })