延迟方法调用
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
我有以下代码:
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