2016-08-05 1 views
0

이 작업이 성공할 때까지 (즉, true을 반환 할 때까지) 코드에서 특정 비동기 작업을 반복하고 싶습니다. 그것은 잘 작동이 같은 출력한다RxJava에서 루프 상태가 참이 될 때

Supplier<Observable<Boolean>> myOperation =() -> { 
    // do something useful and return 'true' if it was successful 
    // NOTE: GENERATING A RANDOM NUMBER IS JUST AN EXAMPLE HERE 
    // I WANT TO RUN AN ASYNCHRONOUS OPERATION (LIKE PINGING A SERVER 
    // OR THE LIKE) AND RETRY IT UNTIL IT SUCCEEDS. 
    System.out.println("Try"); 
    return Observable.just(Math.random() > 0.9); 
}; 

final Throwable retry = new IllegalStateException(); 

Observable.<Boolean>create(subscriber -> { 
    myOperation.get().subscribe(subscriber); 
}).flatMap(b -> b ? Observable.just(b) : Observable.error(retry)) 
    .retryWhen(exceptions -> exceptions.flatMap(exception -> { 
    if (exception == retry) { 
     return Observable.timer(1, TimeUnit.SECONDS); 
    } 
    return Observable.error(exception); 
    })) 
    .toBlocking() 
    .forEach(b -> { 
    System.out.println("Connected."); 
    }); 

:

나는 다음과 같은 해결 방법을 사용하고 순간

내가 원하는 코드는 않습니다

Try 
Try 
... 
Try 
Connected. 

무엇을하지만, '아무튼 매우 우아한 봐. 더 좋은 방법이 있어야합니다. 어쩌면 주문 Operator을 사용하여?

누구나 RxJava에서 동일한 것을 달성하는 방법을 알고 있지만 더 읽기 쉬운 방식으로 인공물이 없으면 Throwable이 없습니까?

답변

0

하지 충분한 시간, 그래서 이것은 메모리가 될 것입니다 ... 당신이 더 복잡한 일을 할 Observable.defer() 및/또는 BehaviorSubject을 조사해야하는 경우

public class Randomizer implements Iterable<Double>, Iterator<Double> { 
    public Iterator<Double> getIterator() {return this;} 
    public boolean hasNext() {return true;} 
    public Double next() {return Math.random();} 
} 

... 

Observable.from(new Randomizer()) 
      .takeWhile(value -> value < 0.99); 
// or takeUntil(value -> value > 0.99); can't remember their differences. 

OTOH.

편집 :

Observable.defer(() -> createConnectionObservable()) 
      .retry((count, err) -> { 
       if(count>9) return false; 
       if(!(err instanceof IOException)) return false; 
       return true; 
      }) 

당신이 개조를 사용하는 경우는 연기를 (필요가 없습니다 것을 명심), 개조 등 : 이제 귀하의 게시물을 읽을 수있는 좀 더 시간이, 당신이 뭔가를 시도 할 수 새로운 가입이 발생하면 통화를 다시 시작합니다.

+0

감사합니다. 솔루션을 제 문제에 매핑하는 데 문제가 있습니다. 성공할 때까지 비동기 작업을 다시 시도하고 싶습니다. 난수 생성은 여기에 그 예가 있습니다. –

+0

다른 접근 방식으로 댓글을 수정했습니다. –

관련 문제