Activities does not get de-registered..

27 views
Skip to first unread message

El bassistos

unread,
Jun 30, 2011, 8:06:22 AM6/30/11
to Google Web Toolkit
I am doing a small "test" application and I am using Activities and
Place but can't make it work as I expect..

I have 2 Views, Activities and Places. DefaultView calls Example1View
and Vice Versa ..

In the Example1Activity I override mayStop() so that it returns a
String asking if user wants to "go to Default". It works the first
time - when I hit "go to Default", it ask if I am "sure, and then I
press " 'OK' - that works, it swaps out the Example1View/Activity and
swap in the DefaultView/Activity.

But when I hit the "go to Example1" from the DefaultView/Activity, it
ALSO ask the question. I can see in the Debugger that first the
DefaultActivity is called, and that it behaves as expected (the
mayStop() returns null), but the ExampleView's mayStop() method is
ALSO called?? Even though it is no "in focus" - "it is about to come
in Focus" .. So it seems as the previous Example1Activity is NOT
deregistered on the EventBus, after I hit the "OK" (which calles the
onClose() method and should cause the ActivityManager to de-registere
the "Activity"..)

Any Ideas ???

Rehgards Jesper - Running GWT 2.2.1 and it is same behavior on FF,
Chrome and Safari


Here is my code:

DefaultPlace.java:
public class DefaultPlace extends Place {}

DefaultView.java:
public class DefaultView extends Composite implements IsWidget{
HorizontalPanel hp = new HorizontalPanel();
Button b = new Button("Go To Example1");

public DefaultView() {
hp.add(b);
initWidget(hp);

}

HasClickHandlers getButton() {
return b;
}
}

DefaultActivity.java
public class DefaultActivity extends AbstractActivity implements
Activity {

ClientFactory clientFactory;
DefaultView defaultView;

public DefaultActivity(DefaultPlace place, ClientFactory
clientFactory) {
this.clientFactory = clientFactory;
}

public void start(AcceptsOneWidget panel, EventBus eventBus) {
defaultView = clientFactory.getDefaultView();
defaultView.getButton().addClickHandler(new ClickHandler() {
public void onClick(ClickEvent event) {
clientFactory.getPlaceController().goTo(new
Example1Place());
}
});
panel.setWidget(defaultView.asWidget());
}
}

Example1Place.java:
public class Example1Place extends Place{}

Example1View
public class Example1View extends Composite implements IsWidget{
HorizontalPanel hp = new HorizontalPanel();
Button b = new Button("Go To Default");

public Example1View() {
hp.add(b);
initWidget(hp);
}

HasClickHandlers getButton() {
return b;
}
}

Example1Activity.java
public class Example1Activity extends AbstractActivity implements
Activity {

ClientFactory clientFactory;
Example1View example1View;

public Example1Activity(Example1Place place, ClientFactory
clientFactory) {
this.clientFactory = clientFactory;

}

public void start(AcceptsOneWidget panel, EventBus eventBus) {
example1View = clientFactory.getExample1View();
example1View.getButton().addClickHandler(new ClickHandler() {
public void onClick(ClickEvent event) {
clientFactory.getPlaceController().goTo(new
DefaultPlace()
);
}
});
panel.setWidget(example1View.asWidget());
}

@Override
public String mayStop() {
return "you sure??";
}
}


AppActivityMapper.java:
public class AppActivityMapper implements ActivityMapper {
private ClientFactory clientFactory;

public AppActivityMapper(ClientFactory clientFactory) {
super();
this.clientFactory = clientFactory;
}

public Activity getActivity(Place place) {
if (place instanceof DefaultPlace)
return new DefaultActivity((DefaultPlace) place,
clientFactory);
else if (place instanceof Example1Place)
return new Example1Activity((Example1Place) place,
clientFactory);
return null;
}
}

ClientFactory.java:
public interface ClientFactory {

DefaultView getDefaultView();
Example1View getExample1View();
EventBus getEventBus();
PlaceController getPlaceController();

}

ClientFactoryImpl.java:
public class ClientFactoryImpl implements ClientFactory {

private final DefaultView DEFAULT_VIEW = new DefaultView();
private final Example1View EXAMPLE_1_VIEW = new Example1View();
private final EventBus EVENT_BUS = new ResettableEventBus(new
SimpleEventBus());
private final PlaceController PLACE_CONTROLLER = new
PlaceController(EVENT_BUS);

public DefaultView getDefaultView() {
return DEFAULT_VIEW;
}

public Example1View getExample1View() {
return EXAMPLE_1_VIEW;
}

public EventBus getEventBus() {
return EVENT_BUS;
}

public PlaceController getPlaceController() {
return PLACE_CONTROLLER;
}
}

MVP.java
public class MVP implements EntryPoint {

public void onModuleLoad() {

SimplePanel display = new SimplePanel();
DefaultPlace defaultPlace = new DefaultPlace();
ClientFactory clientFactory = GWT.create(ClientFactory.class);
EventBus eventBus = clientFactory.getEventBus();
PlaceController placeController =
clientFactory.getPlaceController();
ActivityMapper activityMapper = new
AppActivityMapper(clientFactory);
ActivityManager activityManager = new
ActivityManager(activityMapper, eventBus);
activityManager.setDisplay(display);
placeController.goTo(defaultPlace);
RootPanel.get().add(display);
}
}

Thomas Broyer

unread,
Jun 30, 2011, 9:13:09 AM6/30/11
to google-we...@googlegroups.com
Beware! you have a leak here! your view is a singleton but your activity is disposable: you should remove the ClickHandler from onStop and onCancel otherwise the button keeps references to all the activities ever started!
This is why you experience a slowdown when you remove your mayStop override.

I'm afraid it's not the cause of your issue with mayStop but it's a start…

Mauro Bertapelle

unread,
Jun 30, 2011, 10:16:39 AM6/30/11
to Google Web Toolkit
Well, actually that is the cause of the problem. Just remove the click
handler in the onStop and onCancel otherwise disposed activities will
continue to receive click events
Reply all
Reply to author
Forward
0 new messages