2015-10-07 2 views
3

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

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

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 
     } 
    } 

}); 
+1

Не могли бы вы подробнее остановиться на «прекратить Наблюдаемая»? Вы имеете в виду, что вы хотите содержать всю логику повторного соединения внутри наблюдаемого? Вы хотите, чтобы ваши нисходящие подписчики получали событие, когда вы заканчиваете работу, чтобы они могли повторно подписываться или просто хотите сделать это для них без их участия/участия. – Aaron

ответ

0

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

функция Check observable.filter

+0

Это полезный оператор. Но что, если он не пройдет через фильтр? Означает ли Observable просто прекращение? Потому что я не хочу приступать к логике после цикла if. Как мне сделать фильтр? Должен ли я получить результат цикла if в качестве проверки фильтра? И если это ложь, то что? –

+0

Это остановит цепочку в функции фильтра от испускания большего количества элементов (другими словами, да, ваш метод подписки не будет вызываться) – Richard

6

Вы можете использовать retry оператор Rx. И не нужно прекращать наблюдение.

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

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; 
    }) 
Смежные вопросы