android - 如何在 flatMap 中使用await方法?

标签 android kotlin rx-java kotlinx.coroutines rx-kotlin2

我的问题是这样的。我有下一个代码

Observable.fromIterable(this)
            .flatMap { project ->
                val date = async(CommonPool) {
                    App.db.projectResponseDao().getLastUpdate(project.uid.toString())
                }
                val query = ProjectQuery.builder().id(project.uid.toString()).date(date.await()).build()
                val baseGraphQlUrl = context.getString(R.string.base_graphql_url)
                val apolloCall: ApolloCall<ProjectQuery.Data> = ApiClient.getApolloClient(context.getSessionToken(), baseGraphQlUrl).query(query)
                val remoteObservable: Observable<Pair<Project, Response<ProjectQuery.Data>>> = Observable.combineLatest(
                        Observable.just(project),
                        Rx2Apollo.from(apolloCall),
                        BiFunction { localProject, response -> Pair(localProject, response) })
                remoteObservable
            }

所以,我正在从 Android 应用程序中的 Room 表获取日期。我使用异步方法,因为房间查询需要在与 UI 不同的线程中完成。因此,根据结果,我想为远程数据库构建一个新查询。问题是我想确保日期在创建查询时已经初始化。考虑到这一点,我使用了await方法,但出现了错误。它说我无法在无挂起函数中调用等待函数。那么,你能想一个办法来解决这个问题吗?或者如何解决它?谢谢你

最佳答案

如果您想要做的只是让您的 Rooms 调用脱离主线程,您可以通过添加 .subscribeOn(Schedulers.io( )) 到上面发布的代码末尾。那么您就不需要在 flatMap 内移动线程。

Observable.fromIterable(this)
      .flatMap { project->
      val date = App.db.projectResponseDao().getLastUpdate(project.uid.toString())
      val query = ProjectQuery.builder().id(project.uid.toString()).date(date).build()
      val baseGraphQlUrl = context.getString(R.string.base_graphql_url)
      val apolloCall: ApolloCall<ProjectQuery.Data> = ApiClient.getApolloClient(context.getSessionToken(), baseGraphQlUrl).query(query)
      val remoteObservable: Observable<Pair<Project, Response<ProjectQuery.Data>>> = Observable.combineLatest(
                        Observable.just(project),
                        Rx2Apollo.from(apolloCall),
                        BiFunction { localProject, response -> Pair(localProject, response) })
      remoteObservable
      }
      .subscribeOn(Schedulers.io())

关于android - 如何在 flatMap 中使用await方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49683093/

相关文章:

java - Android:资源不包含资源编号 0x 的包

android - 当 'Use another account' 登录时,谷歌登录不返回任何结果

kotlin - 使用 Kotlin Arrow 库生成镜头

android - 当我在自定义 View 类中使用 R.styleable 时,我得到一个红色的 Unresolved reference : styleable

kotlin - BackoffSupervisor可以有多个子 Actor 吗?

android - RxJava - 基于另一个流取消订阅(重新)订阅

Android应用——成本估算

android - 如何测试手机连通性?

java - 如何停止和恢复 Observable.interval 发出滴答声

android - 延迟除了第一次 Rxjava Android