延迟方法调用

Delay method invocation

我有以下代码:

public void onEnter() {

   Observable<GObject> obs = context.update(activeG);

   obs.subscribe((gObj) -> {

        //TODO: add delay of 3 sec.
        activeG.publishNewG();

        activeG.nextState(GType.RUNNING);
    });
}

我的问题是,我怎样才能延迟 3 秒,所以

activeG.publishNewG()

被调用,然后延迟 3 秒,然后调用

activeGame.nextState(GameStateType.RUNNING);

'publishNewG' returns无效。

谢谢!

据我所知你可以使用 Thread.sleep(3000)

如果没有,应该这样做:

long start = new Date().getTime();
while(new Date().getTime() - start < 3000L){}

您通常会使用某种调度程序来完成此操作。 Java 有 ScheduledExecutorService 可以为您做到这一点。

public class MyClass {
    private final ScheduledExecutorService scheduler;

    public MyClass() {
        scheduler = Executors.newSingleThreadScheduledExecutor();
    }

    public void onEnter() {

        Observable<GObject> obs = context.update(activeG);

        obs.subscribe((gObj) -> {

            activeG.publishNewG();
            // Run in 3 seconds
            scheduler.schedule(() -> {
                activeG.nextState(GType.RUNNING);
            }, 3, TimeUnit.SECONDS);
        });
    }
}

编辑:根据我对 RxJava 文档的理解,这就是您使用 delay:

的方式
public void onEnter() {

    Observable<GObject> obs = context.update(activeG);
    // Observable that delays all events by 3 seconds
    Observable<GObject> delayed = obs.delay(3, TimeUnit.SECONDS);

    // This will fire immediately when an event happens
    obs.subscribe((gObj) -> {
        activeG.publishNewG();
    });
    // This will fire 3 seconds after an event happens
    delayed.subscribe((gObj) ->  {
        activeG.nextState(GType.RUNNING);
    });
}

如果我没理解错的话,你想在 publishNewG 和 nextState 之间延迟 3 秒。您可以使用 doOnNext 在序列中的某些点注入 activity,例如,在延迟 3 秒之前和之后:

Observable.just(1)
.doOnNext(e -> System.out.println("Action before"))
.delay(3, TimeUnit.SECONDS)
.doOnNext(e -> System.out.println("Action after"))
.toBlocking().first();

您可以使用 timer 运算符轻松添加延迟。

例如:

    // simulated stream of events spread apart by 400ms
    Observable<Long> yourObservable = Observable.interval(400, TimeUnit.MILLISECONDS).take(3);

    yourObservable.flatMap(data -> {
        // add delay of 3 seconds
        return Observable.timer(3, TimeUnit.SECONDS).map(i -> data);
    }).map(dataAfterDelay -> {
        // do whatever you want after 3 seconds
        System.out.println("got data " + dataAfterDelay + " after 3 seconds");
        return dataAfterDelay + " processed after delay";
    }).toBlocking().forEach(System.out::println); // toBlocking here just as example to block main thread