Chain Rethinking Calls with RxJava and Returning the Main Object

I am trying to use retrofit + rxjava to make nested api calls. I basically have to create List of Library objects. Each library object has a list of authors, and each Author object has a list of books. This is how my json works.

Json library -

{ title: "Library", items: [ { title: "Library1" image: "http://example.com/image/101/image_lib1.png" url: "http://example.com/api/1" }, { title:"Library2" image: "http://example.com/image/101/image_lib2.png" url: "http://example.com/api/2" }, { title:"Library3" image: "http://example.com/image/101/image_lib3.png" url: "http://example.com/api/3" } ] } 

And the authors are json-

 { title: "Authors", items: [ { title: "JK Rowling" image: "http://example.com/image/101/image_author1.png" url: "http://example.com/api/101" }, { title:"Mark Twain" image: "http://example.com/image/101/image_author2.png" url: "http://example.com/api/201" }, { title:"Charles Dickens" image: "http://example.com/image/101/image_author3.png" url: "http://example.com/api/301" } ] } 

And json books-

 { description: Books, imageurl: "http://example.com/image/101/image_101.png", items: [ { id: 101, title: "Oliver Twist ", description: "some description" }, { id: 1011, title: "Hard times", description: "some more description." } } ] } 

The api interface is given below.

  @GET("/api/") Observable<LibraryResponse> getLibraryList(); @GET("/api/{feedId}") Observable<AuthorResponse> getAuthorList(@Path("feedId") String feedId); @GET("/api/{feedId}") Observable<BooksResponsee> getBooksList(@Path("feedId") String feedId); Observable<List<Library>> observable = myRestInterface .getLibraryList() .map(a -> a.getItems()) .flatMapIterable(b -> b) .flatMap(h -> myRestInterface .getAuthorList(h.getUrl().substring(h.getUrl().lastIndexOf("/") + 1)) .map(x -> x.getItems()) .flatMapIterable(l -> l) .flatMap(e -> myRestInterface .getBooksList(e.getUrl().substring(e.getUrl().lastIndexOf("/") + 1)) .map(d -> d.getItems()) .flatMapIterable(c -> c))) .collect(// ? into list of main object) .doOnNext(mainObjectList -> new ViewupdateMethod(mainObjectList)); .subscribe(...); 

I am trying to create a single Librarylist object that I can use to update my user interface. I'm kinda stuck here. After making several calls, how can I save the results and put everything in a list of library objects?

+5
source share
1 answer
  Observable<List<Library>> observable = myRestInterface .getLibraryList() .flatMapIterable(response -> response.getItems()) .doOnNext(library -> myRestInterface .getAuthorList(library.getUrl().substring(library.getUrl().lastIndexOf("/") + 1)) .flatMapIterable(response -> response.getItems()) .doOnNext(author -> library.getAuthors().add(author)) .doOnNext( author -> myRestInterface .getBooksList(author.getUrl().substring(author.getUrl().lastIndexOf("/") + 1)) .flatMapIterable(response -> response.getItems()) .doOnNext(book -> author.getBooks().add(book)) .subscribe() ) .subscribe() ) .doOnNext(mainObjectList -> new ViewupdateMethod(mainObjectList)) .subscribe(); 

Note .subscribe() . They are used to start the entire chain. RxObservable does nothing until the subscriber arrives.

+3
source

Source: https://habr.com/ru/post/1242728/


All Articles