2016-01-12 2 views
1

Я использую RxJava и вложенные наблюдения, как показано ниже. Я хочу называть одно наблюдаемое внутри другого наблюдаемым и иметь внешнее наблюдаемое излучение результата внутреннего наблюдаемого в Next. Он работает, но я не уверен, что это правильная реализация, поскольку я не смог найти документацию для подтверждения.Правильный способ гнездования наблюдений RxJava?

public Observable<User> updateUser(final String id) { 
    return Observable.create(new Observable.OnSubscribe<User>() { 
     @Override 
     public void call(final Subscriber<? super User> observer) { 
       try { 
       if (!observer.isUnsubscribed()) { 
        getUser(id).subscribe(new Action1<User>() { 
         @Override 
         public void call(User user) { 
          observer.onNext(user); 
           observer.onCompleted(); 
          } 
         }); 
        } 
       } catch (Exception e) { 
        observer.onError(e); 
       } 
     } 
    }); 
} 

public Observable<User> getUser(final String id) { 
... 
} 
+3

Я думаю, предпочтительный способ заключается в цепи наблюдаемых характеристик, а не вкладывать их ... –

+0

^^, не делайте этого. – drewmoore

+0

Почему вы хотите вложить его в нее, вы можете просто сразу вернуться/вызвать getUser? – akarnokd

ответ

0

Избегайте вызовов subscribe, когда вы просто делаете Observable преобразования, как вы должны помнить о всех проблемах, упомянутых @akarnokd и @zsxwing в комментариях.

Я бы также избегал использования Observable.create, потому что при создании OnSubscribe реализация предполагает рассмотрение противодавления и последующего сложного бизнеса с параллелизмом. Предпочитают Observable.just, Observable.from, Observable.range, Observable.defer, Observable.using (их еще есть, проверьте wiki), а для более продвинутых целей - SyncOnSubscribe.

Этот код, вероятно, охватывает ваш случай использования:

public Observable<User> updateUser(final String id) { 
    return getUser(id).doOnNext(user -> updateUser(user)); 
} 

public void updateUser(User user) { 
    //whatever you want here 
} 

public Observable<User> getUser(final String id) { 
    ... 
}