2016-04-19 3 views
0

Ich bin neu bei RxAndroid und versuchen, Antworten zu ketten.RxAndroid Antwort von einem Anruf, um eine andere Anfrage zu machen

Ich verwende diese github API, um Daten abzurufen. Zusammen mit jedem Thema gibt es einen Link für Kommentare und einen Link für Ereignisse, die ich mit einem bestehenden Objekt mit einer Liste von Kommentaren und Ereignissen abrufen und aktualisieren möchte, um so etwas zu bilden.

konnte ich erste Antwort abrufen mit Code folgenden

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

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

Jetzt Wie rufe ich Kommentare und Ereignisse vor Adapter zu aktualisieren? Ich möchte 3 Kommentare und 3 Ereignisse auch zeigen.

+0

Überprüfen Sie, ob dies für Sie hilfreich: http://stackoverflow.com/a/34433400/321354 – rciovati

+0

Sie könnten Schedulers.io() anstelle von Schedulers verwenden möchten. newThread(), da es einen neuen Thread für jede Arbeitseinheit erstellt Im Allgemeinen, wenn Sie mehrere Webdienste ketten möchten, könnten Sie Flatmap dafür verwenden –

Antwort

2

Dank @Riccardo Ciovati für Ihr Beispiel!

Hier ist meine Lösung. und es funktioniert perfekt!

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

} 

wo

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

} 
Verwandte Themen