代码之家  ›  专栏  ›  技术社区  ›  Jhon Fredy Trujillo Ortega

如何在平面图中使用等待方法?

  •  2
  • Jhon Fredy Trujillo Ortega  · 技术社区  · 7 年前

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

    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应用程序中从房间的桌子上获取日期。我使用的是异步方法,因为房间查询需要在与UI不同的线程中完成。因此,我想为远程数据库构建一个新的查询。问题是我想确保在创建查询时日期已经初始化。考虑到这一点,我使用await方法,但给了我一个错误。它说我不能在无挂起函数中调用wait函数。那么,你能想出一个办法来解决这个问题吗?或者如何修复它?非常感谢。

    1 回复  |  直到 7 年前
        1
  •  2
  •   iagreen    7 年前

    如果你所要做的只是让你的房间取消主线程,你可以 flatMap 通过添加 .subscribeOn(Schedulers.io()) 到上面发布的代码末尾。那么就不需要将线程移到内部 平面图

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