2015-02-23 3 views
1

фонаобслуживания вызовов, только если предшествующие наблюдаемый удалось

Я просто погружение в концепцию RX для Java. Честно говоря, я не понимаю. В моем проекте я использую модифицированную библиотеку для звонков. В настоящее время я реализовал все службы с использованием обратного вызова. Если я хочу организовывать вызовы служб, мне приходится вызывать обратные вызовы в обратных вызовах, что приводит к довольно запутанному коду.

Проблема

Для следующих двух служб, я хотел бы назвать обслуживание B тогда и только тогда сервиса завершенными успешно используя подход наблюдаемого.

public interface RetrofitRestService { 

    @GET("...") 
    Observable<Object> A(); 

    @GET("...") 
    Observable<Object> B(); 
} 

Я искал Observable operators я мог бы использовать для моей задачи, но без удачи. Я могу представить себе оператор, как это:

RetrofitRestServices service; 
service.A().ifSuccessfull(B()); 

//OR 
service.A().ifWasNotEmpty(B()); 

//OR 
service.A().useCondition(new Condition(){ ... }, B()); 

ответ

3

Если вы хотите позвонить A, а затем позвонить B, вы можете использовать оператор concat: B будет вызываться, если A завершен.

service.A().concatWith(service.B()).subscribe(); 

Но если возвращение null, B будет называться.

Если это так, то это anwser будет лучше: https://stackoverflow.com/a/28685808/476690

EDIT после комментарий

Если вы хотите использовать результат A() затем flatMap оператора, что вам нужно

service.A().flatMap(resultOfA -> service.B(resultOfA)).subscribe(); 

(давая resultOfA в качестве аргумента B() является лишь примером использования)

Другой способ:

Вы можете построить результат тоже из ответа А, и ответ B

service.A().flatMap(resultOfA -> service.B().zipWith(Observable.just(resultOfA), (a, b) -> new ResultOf(a, b))).subscribe(); 

zip оператор построит результат с результатом А и В , в этом случае. ResultOf это просто пример класса, чтобы показать, как построить результат с результатом A и B.

Более подробную информацию о flapMap: When do you use map vs flatMap in RxJava?

+0

Я собираюсь попробовать это сегодня днем. Как я могу работать с результатом A(), а затем использовать «concatWith»? Мне нужно обработать результат A(). Если это более длинное решение, добавьте в ответ ответ. – zatziky

+1

Я добавил информацию. – dwursteisen

+0

Новая информация выглядит великолепно. Я до сих пор не добрался до дома. Но не могу дождаться, чтобы проверить это. Я верю, что это сработает. Еще одна вещь ... В Android мы все еще используем Java 6, там нет закрытий. Как вы напишете «service.A(). FlatMap (resultOfA -> service.B (resultOfA)). Subscribe();" в Java 6. Я имею в виду, в частности, «resultOfA -> ...». – zatziky

1

Что об этом:

service.A().isEmpty().filter(new Func1<Boolean, Boolean>() { 
    @Override 
    public Boolean call(Boolean empty) { 
     return !empty; 
    } 
}) 
.flatMap(new Func1<Boolean, Observable<? extends Object>>() { 
    @Override 
    public Observable<? extends Integer> call(Boolean empty) { 
     return B(); 
    } 
}); 

Оператор isEmpty издаст логическое значение, которое будет истинным только тогда, когда() ничего не излучает. Вот почему, если A() испускает элемент, фильтр проверяет, будет ли результат isEmpty, и вызывается flatMap, тем самым вызывая B().

+0

Я собираюсь попробовать его сегодня днем. Как я могу работать с результатом A(), а затем использовать «flatMap»? Мне нужно обработать результат A(). Если это более длинное решение, добавьте в ответ ответ. – zatziky

+0

Хм, если вам нужен фактический результат A(), вы можете либо кэшировать его, а затем использовать приведенную выше логику для запуска B(), или если B использует результат A(), используйте ответ, предоставленный dwursteisen. Как вам кажется, вам нужно что-то похожее на код, предоставленный им, поэтому я положил +1 на его ответ. – meddle

+0

Thx Meddle, ваш ответ помог мне понять наблюдаемые больше. – zatziky

Смежные вопросы