【问题标题】:RxAndroid response of one call to make another request一个调用的 RxAndroid 响应以发出另一个请求
【发布时间】:2016-04-19 08:56:17
【问题描述】:

我是 RxAndroid 新手,正在尝试链接响应。

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

[

issue: {

 comments: [

    {
     .
     .
    },
    {
     .
     .
    }
 ]

events : [

    {
     .
     .
    },
    {
     .
     .
    }
 ]

]

]

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

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

    gitHubService.getIssuesList()
            .subscribeOn(Schedulers.newThread())
            .observeOn(AndroidSchedulers.mainThread())
            .map(issues -> Arrays.asList(issues))
            .subscribe(adapter::add);

现在如何在更新适配器之前检索 cmets 和事件?我也想展示 3 个 cmets 和 3 个事件。

【问题讨论】:

  • 检查这是否对您有帮助:stackoverflow.com/a/34433400/321354
  • 你可能想使用 Schedulers.io() 而不是 Schedulers.newThread() 因为它为每个工作单元创建一个新线程 一般来说,如果你想链接多个 Web 服务,你可以使用 flatmap对于它希望这会有所帮助

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


【解决方案1】:

感谢@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);

 }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-23
    • 2022-11-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多