2016-03-23 5 views
11

Ho un osservabile come questoÈ possibile ottenere 2 valori in onNext() del sottoscrittore in rxjava android?

Observable.zip(observable, extObs, new Func2<List<UserProfile>, ArrayList<Extension>, UserProfile>() { 
     @Override 
     public UserProfile call(List<UserProfile> userProfiles, ArrayList<Extension> extensions) { 


      return userProfiles.get(0); 
     } 
    }).subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).unsubscribeOn(Schedulers.io()).subscribe(new Subscriber<UserProfile>() { 
     @Override 
     public void onCompleted() { 

     } 

     @Override 
     public void onError(Throwable e) { 
      e.printStackTrace(); 
     } 

     @Override 
     public void onNext(UserProfile userProfile) { 
      profileListener.onProfileSet(userProfile); 
     } 
    }); 
} 

ho bisogno di passare l'ArrayList nel metodo profileListener.onProfileSet(userProfile); come profileListener.onProfileSet(userProfile,extensions);

E 'possibile farlo in zip o c'è qualche altro metodi di rxjava per risolvere tipo di problemi?

+6

Se non è possibile fare questo, allora si può solo fare una nuova classe di oggetti per contenere sia il profilo e l'estensione –

risposta

10

Devi fare esattamente ciò che cricket_007 suggerito nel commento.

Ad esempio come questo:

  1. Creare una classe che rappresenti i risultati combinati delle tue osservabili:

class CombinedResults { 
    public UserProfile userProfile; 
    public List<Extension> extensions; 

    public CombinedResults(UserProfile userProfile, List<Extension> extensions) { 
     this.userProfile = userProfile; 
     this.extensions = extensions; 
    } 
} 

(In alternativa si può usare Pair classe)

  1. Utilizzare un oggetto di CombinedResults (o Pair) nel proprio Observable.zipFunc2.

Observable.zip(observable, extObs, 
     new Func2<List<UserProfile>, ArrayList<Extension>, CombinedResults>() { 
      @Override 
      public CombinedResults call(List<UserProfile> userProfiles, ArrayList<Extension> extensions) { 
       return new CombinedResults(userProfiles.get(0), extensions); 
      } 
     }) 
     .subscribeOn(Schedulers.io()) 
     .observeOn(AndroidSchedulers.mainThread()) 
     .unsubscribeOn(Schedulers.io()) 
     .subscribe(new Subscriber<CombinedResults>() { 
      @Override 
      public void onCompleted() { 

      } 

      @Override 
      public void onError(Throwable e) { 
       e.printStackTrace(); 
      } 

      @Override 
      public void onNext(CombinedResults combined) { 
       profileListener.onProfileSet(combined.userProfile, combined.extensions); 
      } 
     });