2016-08-05 6 views
0

この操作が成功するまで(つまり、trueを返すまで)、コードで特定の非同期操作を繰り返す必要があります。RxJavaでループする条件がtrueになる

私は次の回避策を使用しています現時点では:「コードは、私が欲しいものを行いますが、それはdoesnの

Try 
Try 
... 
Try 
Connected. 

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."); 
    }); 

それがうまく機能し、このようなものをプリントアウト非常にエレガントな外観。私は良い方法がなければならないと確信しています。おそらくカスタムを使用してOperator

誰かがRxJavaで同じことをよりわかりやすく、人工的なものなしで達成する方法を知っていますか?Throwable

答えて

0

足りない時、これはメモリであることを行っている...

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()および/またはBehaviorSubjectに見えます。

編集:改造として、)(あなたは改修を使用する場合は延期する必要はありませんことを覚えておいてください

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

:今、あなたの記事を読むためにはもう少し時間があります、あなたはこのような何かを試みることができます新しいサブスクリプションが発生したときにコールを再開します。

+0

ありがとうございました。私はあなたの解決策を私の問題にマップするのに困っている。私は成功するまで非同期操作を再試行したい。ここでは、乱数を生成する例を示します。 –

+0

私は別のアプローチでコメントを編集しました。 –

関連する問題