首页 > 解决方案 > 类型不匹配返回带有 fromCallable 的 observable

问题描述

以下代码无法编译:

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>)

}

storeConnections 是从我的 rx 流中调用的:

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?

标签: androidkotlinrx-java

解决方案


鉴于您对问题的回答:

storeConnections 没有返回任何内容。但是我需要将它包装在一个 observable 中以便将它推到流中。所以也许我的问题是当 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 返回“无”,您可以简单地将 Completable.fromAction 移动到您的流中:

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

推荐阅读