RxAndroid响应一次调用再发一次请求

时间:2016-04-19 08:56:17

标签: operators retrofit rx-java chaining rx-android

我是RxAndroid的新手并试图将反应链接起来。

我正在使用此github API来检索数据。除了每个问题,还有与之关联的评论链接和事件链接,我想要获取和更新现有对象以及注释和事件列表,以形成类似这样的内容。

IList<T>

我可以使用以下代码检索初始响应

ICollection<T>

现在如何在更新适配器之前检索注释和事件?我想展示3条评论和3个活动。

1 个答案:

答案 0 :(得分:2)

感谢@Riccardo Ciovati的榜样!

这是我的解决方案。它完美无缺!

public static void getIssuesForRepo(final IssuesListAdapter adapter) {

    GitHubService gitHubService = ServiceFactory.createServiceFrom(GitHubService.class, GitHubService.ENDPOINT);

    gitHubService.getIssuesList()
            .subscribeOn(Schedulers.newThread())
            .observeOn(AndroidSchedulers.mainThread())
            .map(issues -> Arrays.asList(issues))
            .flatMap(issues -> Observable.from(issues))
            .filter(issue -> issue.getCommentsUrl() != null)
            .flatMap(new Func1<Issue, Observable<Issue>>() {
                @Override
                public Observable<Issue> call(Issue issue) {


                    return gitHubService.getComments(issue.getNumber())
                            .subscribeOn(Schedulers.newThread())
                            .observeOn(AndroidSchedulers.mainThread())
                            .map(comments -> {

                                issue.setCommentList(Arrays.asList(comments));

                                return issue;
                            });
                }


            })
            .toList()
            .subscribe(adapter::add);

}

,其中

public interface GitHubService {

  String ENDPOINT = "https://api.github.com/";

  @GET("repos/crashlytics/secureudid/issues")
  Observable<Issue[]> getIssuesList();

  @GET("repos/crashlytics/secureudid/issues/{number}/comments")
  Observable<Comment[]> getComments(@Path("number") long number);

 }