2016-04-19 4 views
0

私はRxAndroidが新しく、応答をチェーンしようとしています。RxAndroidが別のリクエストを行うための呼び出しの応答

私はこのgithub APIを使用してデータを取得しています。それぞれの問題に加えて、それに関連するコメントリンクとイベントリンクがあります。このオブジェクトには、既存のオブジェクトを取得して更新するコメントやイベントのリストがあります。

私は今、私は、アダプタを更新する前に、コメントやイベントを取得するにはどうすればよい次のコード

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

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

で初期応答を取得することができますか?私は3つのコメントと3つのイベントも表示したい。

+0

チェックこれはあなたのために有用である場合:http://stackoverflow.com/a/34433400/321354 – rciovati

+0

あなたはSchedulers.io()の代わりに、スケジューラを使用する場合があります。 newThread()は、作業単位ごとに新しいスレッドを作成するので、一般的に複数のWebサービスをチェーンしたい場合は、フラットマップを使用できます –

答えて

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); 

} 
関連する問題