【问题标题】:RxJava concatMap no responseRxJava concatMap 无响应
【发布时间】:2017-10-19 22:15:45
【问题描述】:

希望你们一切都好, 我一直在使用 RxJava 和 Retrofit 开发个人 Android 项目。这是对 GitHub 问题的搜索请求,当用户单击搜索按钮并使用 PublishSubject 对象发出搜索文本时,我会收到用户的输入。

button.setOnClickListener(view -> {
    publishSubject.onNext(editText.getText().toString());
});

我正在使用这样的改造将这个发射映射到Observable

publishSubject.concatMap(dataModel::getIssues)
              .subscribeOn(Schedulers.computation())
              .observeOn(AndroidSchedulers.mainThread())
              .subscribe(this::loadData, this::onError);

public Observable<List<Issue>> getIssues(String queryText) {
    String[] query_params = queryText.split("/");
    return gitHubApiService.getIssues(query_params[0], query_params[1], "open");
}

结果我期待ListIssues

public void loadData(List<Issue> issues) {
    mProgressDialog.setVisibility(View.INVISIBLE);

    if( issues.size() == 0) {
        noIssueText.setVisibility(View.VISIBLE);
    } else {
        mRecyclerView.setVisibility(View.VISIBLE);
        mIssuesList.clear();
        mIssuesList.addAll(issues);
        mAdapter.notifyDataSetChanged();
    }
}

但我的代码似乎有一些实现问题,因为它从不从网络发出任何东西,即使在错误时也不会被调用。 我已经使用从 Retrofit API 获得的 Observable 测试了相同的示例,所以没有改造错误,所以我认为我的 concatMap 逻辑存在一些问题。 任何帮助将不胜感激

【问题讨论】:

  • .subscribeOn(Schedulers.computation()) 你应该订阅io,因为你正在做 io,那里
  • 试过了,但没有成功,但解决了它在 getIssues 方法中添加 scheduleOn ,如下面的答案

标签: android rx-java retrofit2 flatmap concatmap


【解决方案1】:

在第一次解析时,我认为您可能正在主线程中进行网络调用。您是否尝试过以下方法?

public Observable<List<Issue>> getIssues(String queryText) {
  String[] query_params = queryText.split("/");
  return gitHubApiService.getIssues(query_params[0], query_params[1], "open")
       .subscribeOn(Schedulers.io());
}

问题是,您的 onClickListener 回调在主线程上运行,并且可观察管道中没有其他上下文切换。

【讨论】:

  • 嘿,谢谢它的工作,但我不知道为什么它不能在主线程上运行。它也应该显示结果。
  • gitHubApiService 是,我假设一个 Retrofit2 客户端。在 Retrofit + Rx 中,没有使用 OkHttp 线程池/回调池,而是使用了 Rx 更灵活的调度器系统。这意味着除非您在创建客户端时显式使用a scheduler,否则默认情况下所有调用不会切换调度程序。
  • 好的,我明白了,但是我也在 concatMap 操作之后指定了调度程序,但是为什么我的 Observable 没有使用它。
  • subscribeOn 仅适用一次 - 在启动链的原始 subscribe 处(顺便说一句,计算?)。一旦您订阅PublishSubject,该调度程序就会停止使用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-08
  • 2015-12-13
相关资源
最近更新 更多