我正在围绕zurb基础编写一些包装类。
基础窗口小部件需要在将元素添加到DOM后调用init()
函数。
我可以使用这种方法轻松完成此任务:
public static void initWidgets() {
Scheduler.get().scheduleDeferred(new Scheduler.ScheduledCommand() {
@Override
public void execute() {
foundationInit();
}
});
}
...其中foundationInit()
是对基金会init()
函数的JSNI调用。然后我在任何基础元素的构造函数中添加对initWidgets()
的调用。到目前为止一切都很好。
但是,如果在特定事件循环期间向DOM添加了多个基础窗口小部件,则将多次调用init()
方法。基金会实际上并不关心这一点,但找到解决这个问题的方法会很好。
是否有任何调度程序功能/模式允许我安排特定命令只运行一次,无论使用该命令调用调度方法的次数是多少?
类似于:scheduleDeferredIfNotAlreadyScheduled(Command c)
我不知道如何处理事件循环,所以我不知道如何重置一个告诉我是否添加命令的标志。
答案 0 :(得分:1)
我不知道任何Scheduller命令可以做到这一点,但可以使用静态布尔变量来完成,例如:
private static boolean initialized;
public static void initWidgets() {
initialized = false;
Scheduler.get().scheduleDeferred(new Scheduler.ScheduledCommand() {
@Override
public void execute() {
if (!initialized) {
initialized = true;
foundationInit();
}
}
});
}
答案 1 :(得分:0)
在这种情况下,我通常使用Guava的Supplier.double检查锁定是非常安全的。
public static Supplier<Boolean> supplier=Suppliers.memoize(new Supplier<Boolean>() {
@Override
public Boolean get() {
foundationInit();
return true;
}
});
public static void initWidgets() {
Scheduler.get().scheduleDeferred(new Scheduler.ScheduledCommand() {
@Override
public void execute() {
boolean initialized=supplier.get();
}
});
}