GWT - 每个事件循环只运行一次命令

时间:2014-02-15 13:53:50

标签: gwt

我正在围绕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)

我不知道如何处理事件循环,所以我不知道如何重置一个告诉我是否添加命令的标志。

2 个答案:

答案 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();
        }
    });
}