【问题标题】:How to chain observables in rxjava2如何在 rxjava2 中链接 observables
【发布时间】:2017-04-10 11:20:44
【问题描述】:

我的代码中有两个 observables。第一个是用于搜索按钮单击和文本更改的合并 observable。

Observable<String> buttonClickStream = createButtonClickObservable();
Observable<String> textChangeStream = createTextChangeObservable();
Observable<String> searchTextObservable 
    =Observable.merge(buttonClickStream,textChangeStream);

disposable = searchTextObservable
    .observeOn(AndroidSchedulers.mainThread())
    .doOnNext(s -> showProgressBar())
    .observeOn(Schedulers.io())
    .map(this::getStarredRepos)
    .observeOn(AndroidSchedulers.mainThread())
    .subscribe(gitHubRepos -> {
        hideProgressBar();
        showResults(gitHubRepos);
    });

第二个 observable 用于从服务器获取响应。:

private List<GitHubRepo> getStarredRepos(String username) {
    RestInterface restService=RestService
       .getClient().create(RestInterface.class);
    restService.getStarredRepos(username)
       .observeOn(AndroidSchedulers.mainThread())
       .subscribeOn(Schedulers.io())
       .subscribe(this::handleResponse, this::handleError);

    return repoList;
}

现在的问题是,hideProgressBar() 和 showResults() 方法在 handleResponse() 完成之前执行。

我是 RxJava 新手,所以如果代码有任何错误,请纠正。

【问题讨论】:

    标签: android rx-java2


    【解决方案1】:

    您的List&lt;GitHubRepo&gt; getStarredRepos(...) 应改为Observable&lt;List&lt;GitHubRepo&gt;&gt; getStarredRepos(...)。不要订阅这个方法内部的 observable,而是返回你从 restService 得到的 observable(如果你需要处理响应,在返回之前放一个map(),对于错误你可以使用onErrorReturn()或者你需要的东西) .

    然后用.switchMap(this::getStarredRepos)代替.map(this::getStarredRepos)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-07-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-11
      • 2016-09-07
      • 2020-08-07
      • 2019-03-17
      相关资源
      最近更新 更多