2015-05-21 2 views
4

Я пишу приложение для Android. В какой-то момент мне нужно проверить результат, возвращаемый методом Retrofit, и если он вернет true - выполните еще один запрос API. Без Rx логика выглядит следующим образом:Добавить RxJava Observer в цепочку в зависимости от состояния

if(api.isVip()) { 
    checkIfPendingCancellation(); 
} else { 
    JoinVipActivity.start(); 
} 

checkIfPendingCancellation() { 
    if(api.pendingCancel()) { 
     YourVipIsAboutToCancelActivity.start(); 
    } else { 
     CancelVipActivity.start(); 
    } 
} 

Я знаю, что можно обернуть все с Rx, но точно не знаю, как сделать это. Какие-либо предложения?

ответ

2

Если предположить, что API не является RxJava основе, вы можете сделать что-то вроде этого:

Observable.just(1) 
.map(v -> { 
    if (api.isVip()) { 
     if (api.pendingCancel()) { 
      return 1; 
     } 
     return 2; 
    } 
    return 3; 
}) 
.subscribeOn(Schedulers.io()) 
.observeOn(AndroidSchedulers.mainThread()) 
.subscribe(v -> { 
    if (v == 1) { 
     YourVipIsAboutToCancelActivity.start(); 
    } else 
    if (v == 2) { 
     CancelVipActivity.start(); 
    } else { 
     JoinVipActivity.start(); 
    } 
}); 

(Примечание:. Observable.just(1).map().subscribeOn() мой любимый способ для придания импульса первоначально синхронная обработка)

В противном случае, поскольку дооснащения поддерживает наблюдаемые RxJava в (? с мостом я думаю), вы можете иметь оба API вызовы, как Observable<Boolean> в этом случае вы можете использовать flatMap:

api.isVip() 
.flatMap(b -> { 
    if (b) { 
     return api.pendingCancel().map(c -> c ? 1 : 2); 
    } 
    return Observable.just(3); 
}) 
.subscribeOn(Schedulers.io()) 
.observeOn(AndroidSchedulers.mainThread()) 
.subscribe(v -> { 
    if (v == 1) { 
     YourVipIsAboutToCancelActivity.start(); 
    } else 
    if (v == 2) { 
     CancelVipActivity.start(); 
    } else { 
     JoinVipActivity.start(); 
    } 
}); 
+1

Да, я могу использовать наблюдаемые. И решение является хорошим. Но возможно ли в теории придумать что-то, что не требует включения onSuccess? Я смотрел на всех таких операторов, как «switchCase» и «if», но я понятия не имею, как их использовать :) – Anton

+0

Вы можете попробовать их, но они более подробные, повторяются операторы и, возможно, менее читаемы. – akarnokd

+0

ОК, спасибо! – Anton

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