2017-09-14 7 views
1

Code actuelComment passer un Pojo personnalisé en paramètre à l'appel de la méthode d'interface dans rxjava2 Observable?

Observable.from(listMovie)//list of movie 
      .flatMap(new Func1<Movie, Observable<FavMovieRes>>() { 
       @Override 
       public Observable<FavMovieRes> call(Movie movie) { 
        return moviesAPI.makeMovieFav(userId), 
        sessionId, new MakeMovieFav("movie", movie.getId(), movie.isFavList())); 
       } 
      }) 
      .subscribe(new Subscriber<FavMovieRes>() { 
     @Override 
     public void onCompleted() { 

     } 

     @Override 
     public void onError(Throwable e) { 

     } 

     @Override 
     public void onNext(FavMovieRes favMovieRes) { 

     } 
    }); 

Dans le code ci-dessus je passe la liste d'objets de film à la Observable et effectuer une opération sur chaque instance de film dans la liste quand le résultat obtient de l'API Je souhaite modifier une base de données en ce qui concerne ce film instance comment puis-je obtenir chaque instance de film dans OnNext() ainsi que la méthode onError de la méthode subscribe. ce que je veux est

Observable.from(listMovie) 
       .flatMap(new Func1<Movie, Observable<FavMovieRes>>() { 
        @Override 
        public Observable<FavMovieRes> call(Movie movie) { 
         return moviesAPI.makeMovieFav(String.valueOf(SharedPreferenceDataManager.getUserId(SyncFavListPeriodicTask.this)), SharedPreferenceDataManager.getSessionId(SyncFavListPeriodicTask.this), new MakeMovieFav("movie", movie.getId(), movie.isFavList())); 
        } 
       }).subscribe(new Subscriber<FavMovieRes>() { 
      @Override 
      public void onCompleted() { 

      } 

      @Override 
      public void onError(Throwable e,Movie movie) {//or MakeMovieFav makeMovieFav 

      } 

      @Override 
      public void onNext(FavMovieRes favMovieRes,Movie movie) {//or MakeMovieFav makeMovieFav 

      } 
     }); 

Répondre

0

Je suppose que vous avez une liste et que vous voulez traiter chaque élément reçu pour une autre opération asynchrone unique. Dans ce cas, vous pouvez flatmap chaque résultat. Signifie qu'il divisera chaque élément de la liste en observable pour l'opération suivante dans votre flux. flatMap signifie qu'il effectuera une opération sur la valeur reçue.

Si vous souhaitez regrouper les résultats, vous pouvez utiliser toList après flatMap.

Vous devez créer un Observable (Operation) pour votre flatmap.

Kotlin:

Observable.just(data) 
     .flatMapIterable { it } 
     .flatMap{ moviesAPI.makeMovieFavObservable(whatEver) } 
     .subscribe(... , ... , ...) 

Java (non testé)

Observable.just(data) 
      //parse each item in the list and return it as observable 
      .flatMapIterable(d -> d) 
      // use each item and to another observable operation 
      .flatMap(data -> Observable.just(moviesAPI.movieStuff(data)))       
      // use each result and put it back into a list 
      .toList() // put the result back to a list 
      // subscribe it and log the result with Tag data, throw the error and output when completed 
      .subscribe(data -> Log.d("Data", "Data received "+ data), 
         error -> error.printStackTrace(), 
         () -> Log.d("Completed", "Completed") 
      ); 
+0

Non que je veux atteins déjà j'obtenir les données que je processus sur les données non après la process.In Dans ce cas, chaque objet résultat je le veux dans un appel de méthode (Résultat du résultat) et appel (Throwable throwable, Result result). – Ajinkya