Как завершить Observable?

У меня есть наблюдаемое, которое я хочу завершить, если определенное условие не выполняется (то есть, если ответ с определенного веб-сайта не удался), чтобы я мог повторно запросить веб-сайт и снова вызвать наблюдаемое. Как мне это сделать?

Вот что я хочу сделать:

Observable.create(new Observable.OnSubscribe<String>() {
    @Override
    public void call(Subscriber<? super String> subscriber) {

        //Perform network actions here

        if (!response.isSuccessful()) {
            //terminate this Observable so I can retrieve the token and call this observable again
        }
    }

});

person Community    schedule 07.10.2015    source источник
comment
Не могли бы вы уточнить, как прекратить работу Observable? Вы имеете в виду, что хотите содержать всю логику повторного подключения внутри наблюдаемого? Хотите ли вы, чтобы ваши нижестоящие подписчики получали событие, когда вы завершаете подписку, чтобы они могли повторно подписаться, или вы просто хотите сделать это для них без их участия.   -  person Aaron    schedule 07.10.2015


Ответы (2)


Вы можете использовать оператор retry Rx. И не нужно прерывать Observable.

Определено пользовательское исключение:

public class FailedException extends RuntimeException{
    // ...
}


private static final int RETRY_COUNT = 3; // max retry counts
Observable.create(new Observable.OnSubscribe<String>() {
        @Override
        public void call(Subscriber<? super String> subscriber) {
            //Perform network actions here
            if (!response.isSuccessful()) {
                // if response is unsucceed, invoke onError method and it will be stop emit data and into retry method.
                subscriber.onError(new FailedException());
            }
        }

    })
    .retry((integer, throwable) -> {
        // Retry network actions when failed.
        // if return true, Observable will be retry to network actions emit data;
        // if return false, you can process in onError() method of Subscribe.
        return throwable instanceof FailedException && integer < RETRY_COUNT;
    })
person WangJie    schedule 07.10.2015

Вы можете отфильтровать результат перед подпиской. Не обрабатывайте это при создании наблюдаемого.

Проверьте функцию observable.filter

person Richard    schedule 07.10.2015
comment
Это полезный оператор. Но что, если он не пройдет через фильтр? Наблюдаемый просто останавливается? Потому что я не хочу продолжать логику после моего цикла if. Как бы я поступил с фильтром? Должен ли я иметь результат цикла if в качестве проверки фильтра? А если ложно, то что? - person ; 07.10.2015
comment
Это остановит цепочку в функции фильтра от создания большего количества элементов (другими словами, да, ваш метод подписки не будет вызываться) - person Richard; 07.10.2015