如何在rxjava2中链接observable

时间:2017-04-10 11:20:44

标签: android rx-java2

我的代码中有两个observable。第一个是合并的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的新手,所以如果代码中有任何错误,请纠正。

1 个答案:

答案 0 :(得分:1)

您的List<GitHubRepo> getStarredRepos(...)应该是Observable<List<GitHubRepo>> getStarredRepos(...)。不要订阅此方法内部的observable,但返回从restService获取的observable(如果需要处理响应,请在返回之前放置map(),对于可以使用的错误{{1}或者你需要的东西)。

然后代替onErrorReturn().map(this::getStarredRepos)