如何在 rxjava2 中链接可观察对象
How to chain observables in rxjava2
我的代码中有两个可观察值。第一个是用于搜索按钮点击和文本更改的合并可观察对象。
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,如有错误请指正。
您的 List<GitHubRepo> getStarredRepos(...)
应该改为 Observable<List<GitHubRepo>> getStarredRepos(...)
。不要订阅这个方法里面的observable,但是return你从restService得到的observable(如果你需要处理响应,在returning之前放一个map()
,为了错误你可以使用 onErrorReturn()
或你需要的东西)。
然后 .map(this::getStarredRepos)
改为 .switchMap(this::getStarredRepos)
.
我的代码中有两个可观察值。第一个是用于搜索按钮点击和文本更改的合并可观察对象。
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,如有错误请指正。
您的 List<GitHubRepo> getStarredRepos(...)
应该改为 Observable<List<GitHubRepo>> getStarredRepos(...)
。不要订阅这个方法里面的observable,但是return你从restService得到的observable(如果你需要处理响应,在returning之前放一个map()
,为了错误你可以使用 onErrorReturn()
或你需要的东西)。
然后 .map(this::getStarredRepos)
改为 .switchMap(this::getStarredRepos)
.