2011-11-01 3 views
2

J'essaie de me familiariser avec les activités et les lieux de GWT. Je suis en train de tester avec un code source trouvé à l'origine sur ce bon blog post.Les gestionnaires d'activité ne sont pas supprimés

Je trouve que les gestionnaires qui sont ajoutés pendant bind() ne semblent jamais être supprimés. Ma petite compréhension du Activity javadoc m'a fait penser qu'ils devraient être retirés automagiquement au moment où la méthode onStop() de l'activité est appelée. Tous les gestionnaires d'événements enregistrés ont été supprimés avant l'appel de la méthode . Mais chaque fois que je clique sur un bouton, le gestionnaire correspondant est appelé n + 1 fois.

Qu'est-ce qui me manque? S'il vous plaît laissez-moi savoir s'il y a plus d'informations que je peux fournir.

Voici un extrait pertinent du code:

public class ContactsActivity extends AbstractActivity { 

private List<ContactDetails> contactDetails; 
private final ContactsServiceAsync rpcService; 
private final EventBus eventBus; 
private final IContactsViewDisplay display; 
private PlaceController placeController; 

public interface IContactsViewDisplay { 
    HasClickHandlers getAddButton(); 
    HasClickHandlers getDeleteButton(); 
    HasClickHandlers getList(); 
    void setData(List<String> data); 
    int getClickedRow(ClickEvent event); 
    List<Integer> getSelectedRows(); 
    Widget asWidget(); 
} 

public ContactsActivity(ClientFactory factory) { 
    GWT.log("ContactActivity: constructor"); 

    this.rpcService = factory.getContactServiceRPC(); 
    this.eventBus = factory.getEventBus(); 
    this.display = factory.getContactsView(); 
    this.placeController = factory.getPlaceController(); 
} 

@Override 
public void start(AcceptsOneWidget container, EventBus eventBus) { 
    GWT.log("ContactActivity: start()"); 

    bind(); 
    container.setWidget(display.asWidget()); 
    fetchContactDetails(); 

} 

public void bind() { 

    GWT.log("ContactActivity: bind()"); 

    display.getAddButton().addClickHandler(new ClickHandler() { 
     public void onClick(ClickEvent event) { 
      GWT.log("Add button clicked"); 
      ContactsActivity.this.placeController.goTo(new NewContactPlace("")); 
     } 
    }); 

    display.getDeleteButton().addClickHandler(new ClickHandler() { 
     public void onClick(ClickEvent event) { 
      GWT.log("ContactActivity: Delete button clicked"); 
      deleteSelectedContacts(); 
     } 
    }); 

    display.getList().addClickHandler(new ClickHandler() { 
     public void onClick(ClickEvent event) { 
      GWT.log("ContactActivity: List clicked"); 
      int selectedRow = display.getClickedRow(event); 

      if (selectedRow >= 0) { 
       String id = contactDetails.get(selectedRow).getId(); 
       ContactsActivity.this.placeController.goTo(new EditContactPlace(id)); 
      } 
     } 
    }); 
} 

Répondre

6

événements enregistrés par. le EventBus passé à AbstractActivity#start() ne sera pas enregistré au moment où onStop() est appelée. Les gestionnaires d'événements enregistrés dans la méthode bind() ci-dessus ne sont cependant pas enregistrés via le EventBus et ne sont pas visibles par la classe de base abstraite. Vous devez les désenregistrer vous:

public class ContactsActivity extends AbstractActivity { 
    private List<HandlerRegistration> registrations = new ArrayList(); 

    private void bind() { 
    registrations.add(display.getAddButton(). 
     addClickHandler(new ClickHandler() { ... })); 
    registrations.add(display.getDeleteButton(). 
     addClickHandler(new ClickHandler() { ... })); 
    registrations.add(display.getList(). 
     addClickHandler(new ClickHandler() { ... })); 
    } 

    @Override 
    public void onStop() { 
    for (HandlerRegistration registration : registrations) { 
     registration.removeHandler(); 
    } 

    registrations.clear(); 
    } 
} 
+0

merci beaucoup pour votre suggestion. Je suis maintenant capable de désenregistrer les gestionnaires dans onStop(). est-il plus courant et préférable de passer les gestionnaires via EventBus dans AbstractActivity # start()? Comment cela se fait-il autre que d'utiliser @UiHandler? – Justin

+0

EventBus est destiné aux événements inter-applications et non aux événements d'interface utilisateur. Vous faites les choses correctement. –

0

Je l'ai trouvé mieux pour gérer l'enregistrement dans la vue - le rendre responsable de garder un seul clic clapoteuses actif pour chaque bouton.

Au lieu de:

class View { 
    Button commitButton; 

    public HasClickHandlers getCommit() {return commitButton;} 
} 

lien ..et à cela dans l'activité:

view.getCommit.addClickHandler(new Clickhandler()... 

Faites ceci dans la vue:

class View { 
     private Button commitButton;   
     private HandlerRegistration commitRegistration = null; 

     public void setCommitHandler (ClickHandler c) { 
      commitRegistraion != null ? commitRegistration.removeRegistration(); 
      commitRegistration = commitButton.addClickHandler (c); 
     } 
    } 

Et l'activité:

view.setCommitHandler (new ClickHandler() ... 

Espérons que ça aide.

Questions connexes