【问题标题】:Type mismatch returning an observable with fromCallable类型不匹配返回一个带有 fromCallable 的 observable
【发布时间】:2019-06-03 11:45:07
【问题描述】:

以下代码无法编译:

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?

【问题讨论】:

  • 很难说除非你指定这个乐趣应该做什么。为什么storeConnections 会返回 obervable?它在观察什么?
  • @TimCastelijns 这就是问题所在。 storeConnections 没有返回任何内容。但是我需要将它包装在一个 observable 中以便将它推到流中。所以也许我的问题是当 API 调用什么都不返回时,如何用 Observable 包装 API 调用。我见过的大多数示例都从 api 返回了一些东西。但是这个没有
  • 我需要将它包装在一个 observable 中以便将其推送到流中。你能澄清一下吗?
  • 函数mapper.toDb(it)返回什么?
  • 我更新了我的问题并显示了调用 storeConnections 的代码。它在需要 Observable 的 flatMap 中使用 fromCallable 调用。

标签: android kotlin rx-java


【解决方案1】:

鉴于您对问题的回答:

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

【讨论】:

    【解决方案2】:

    让它工作的关键是使用这个:

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

    【讨论】:

      猜你喜欢
      • 2015-04-19
      • 1970-01-01
      • 2021-03-23
      • 1970-01-01
      • 1970-01-01
      • 2012-12-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多