我有一个活动需要另一个类'服务来检索一些数据(“DataClass”)。可以调用此数据类来获取数据,并在成功时触发事件。 第一次活动需要数据处于“开始”状态 - 解决当前位置带来的状态并相应地更新视图。
问题是onDataEvent方法的活动不是第一次被调用,而是在后续事件中被调用。我查看了活动的处理程序。按时触发第一个事件,活动将在此事件中注册。我也尝试使用构造函数注册事件,但这没有任何改变。 那么如何在start方法中为事件注册活动,触发并对其做出反应?或者如何一般地实现这样的用例。
修改 与此同时,我试图像here那样实现它,但没有成功。
这是start方法的代码:
@Override
public final void start(final AcceptsOneWidget panel, final com.google.gwt.event.shared.EventBus eventBus) {
this.eb = new ResettableEventBus(eventBus);
if (!(pc.getWhere() instanceof DynamicTablePlace)) {
throw new IllegalStateException(CreateDynamicTableActivity.class.getName() + " should only be called on "
+ DynamicTablePlace.class.getName());
}
view.setPresenter(this);
this.eb.addHandler(DynamicTableHashResolvedEvent.TYPE, this);
stateResolver.resolveState(((DynamicTablePlace) pc.getWhere()).getTablehash(), eb); //this is triggering the event
panel.setWidget(view);
}
onDynamicTableHashResolved(DynamicTableHashResolvedEvent事件)方法不是第一次调用,而是在所有后续事件中调用。
答案 0 :(得分:0)
在google groups,有人指出了我的问题。我已经偶然发现了这种问题。问题是:如果浏览器处理某些事件(在场所更改事件时调用活动开始方法)并且您在此过程中注册另一个事件并触发刚刚注册的事件将无法工作 - 注册不是“完成”此时。 解决方案很简单:在我的代码中触发事件“延迟”:
Scheduler.get().scheduleFinally(new ScheduledCommand() {
@Override
public void execute() {
stateResolver.resolveState(((DynamicTablePlace) pc.getWhere()).getTablehash(), eb);
}
});
问题是:这会打破此活动的测试能力(没有gwt测试用例)。
来自Thomas Broyer的:如果注入调度程序,我通常可以测试,并且提供了一个StubScheduler用于测试。在我的情况下,我为调度程序创建了一个只执行命令的模拟 - 在我的情况下,只有scheduleFinally(ScheduledCommand cmd)必须实现。