使用Observable.interval等待远程数据或超时

时间:2017-05-29 04:31:29

标签: java rx-java observable

我需要等待条件或超时。我提出了以下方法,但发生的事情太多了。我怎么能压缩这个。

import io.reactivex.Observable;
import java.util.concurrent.TimeUnit;
import io.reactivex.schedulers.Schedulers;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.ThreadLocalRandom;

public class Test{
  public static void main(String[] args)throws InterruptedException{
    AtomicBoolean toggle = new 
    java.util.concurrent.atomic.AtomicBoolean(true);
    Observable.interval(0,50, TimeUnit.MILLISECONDS)
            .takeWhile(l->l<(20000/50))
            .takeWhile(l-> toggle.get())
            .observeOn(Schedulers.io())
            .map(l->{ return (l>ThreadLocalRandom.current()
                            .nextInt(5, 20 + 1))?true:false;})
             // The above map will call a remote function to check for some condition
            .observeOn(Schedulers.computation())
            .filter(exist->exist)
            //.takeWhile(exist->!exist)
            .map(l->{toggle.set(false);return l;})
            .map(l->{System.out.println("Called at "+l);return l;})
            .blockingSubscribe();
    }
}

1 个答案:

答案 0 :(得分:1)

这是代码。您可以使用firstElement获取第一个项目。

import io.reactivex.Observable;
import io.reactivex.schedulers.Schedulers;

import java.util.concurrent.ThreadLocalRandom;
import java.util.concurrent.TimeUnit;

public class Q44234633 {
  public static void main(String[] args) throws InterruptedException {
    Observable.interval(50, TimeUnit.MILLISECONDS)
        .takeWhile(l -> l < 400)
        .observeOn(Schedulers.io())
        .filter(l -> isConditionTrue(l))
        .observeOn(Schedulers.computation())
        .firstElement()
        .doOnSuccess(System.out::println)
        .isEmpty()
        .filter(empty -> empty)
        .doOnSuccess(b -> System.out.println("TimeOut"))
        .blockingGet();
  }

  private static boolean isConditionTrue(long time) {
    return time > ThreadLocalRandom.current().nextInt(5, 20 + 1);
  }
}

还有两个提示。

  1. 如果您实际上没有映射该值,则可以使用doOnNext而不是map
  2. BooleanValue? true : false可以直接写为BooleanValue