2012-08-09 2 views
0

내 GXT 프로젝트에서 MVP 패턴을 구현했습니다. 시스템은 고객을 기능의 일부로 등록합니다. 또한 시스템 사용자는 ID를 제공하는 등록 된 사용자를 검색 할 수 있습니다.GXT 사용자 지정 이벤트 처리기 코드가 여러 번 실행됩니다.

나는 "고객 검색"버튼에 OnClick 이벤트를 추가했습니다.

/* On click search button */ 
     view.getBtnSearch().addListener(Events.OnClick, new Listener<BaseEvent>() { 
      @Override 
      public void handleEvent(BaseEvent be) { 
       eventBus.fireEvent(new CustomerRegistrationTabSelectionEvent(0, false)); 
       eventBus.fireEvent(new CustomerFetchEvent(view.getValueCustSearchParameter(), view.getValueCustSearchValue(), true)); 
      } 
     }); 

CustomerRegistrationTabSelectionEvent는 관련 탭을 선택하고 다른 탭을 활성화합니다. 그게 다 그렇습니다.

다음은 CustomerFetchEvent 사용자 지정 이벤트의 처리기입니다.

eventBus.addHandler(CustomerFetchEvent.TYPE, new CustomerFetchEventHandler() { 
      @Override 
      public void fetchCustomer(CustomerFetchEvent event) { 
       searchCustomer(event.getParameter(), event.getParameterValue(), event.isOpenFirstTab()); 
      } 
     }); 

검색 고객 방법이 여러 번 실행되고 잘못된 검색이있는 경우 오류 메시지 대화 상자에 여러 개의 팝업이 표시됩니다. searchCustomer 메소드 내에서 고객 데이터를 가져 오는 서비스를 호출하거나 검색이 유효하지 않은 경우 팝업 오류 메시지를 표시합니다.

im은 GXT 2.2.5 및 JRE 1.6을 사용합니다.

코드가 여러 번 실행되는 이유를 찾는 사람이 있습니까?

나중에 추가 : 처음 응용 프로그램을 실행할 때 코드는 한 번만 실행되므로 한 번의 팝업 만 실행됩니다. 그런 다음 시스템을 로그 아웃하고 다시 로그인하십시오 ("고객 검색"버튼이있는 동일한 페이지로 이동). 코드가 두 번 실행됩니다. 마찬가지로 특정 페이지를 생성/탐색하는 횟수와 동일하게 코드가 실행됩니다. 실제로 페이지를 다시 작성할 때마다 마지막 이벤트 핸들러 코드를 제거하지 않고 이벤트 핸들러 코드를 추가합니까?

답변

0

예. 해결 방법은 다음과 같습니다 Unbinding presenters necessary in GWT

U 자세한 내용은 여기를 참조하십시오. http://draconianoverlord.com/2010/11/23/gwt-handlers.html

실제로 발생한 일은 HandlerManager에 등록되어 이벤트를 수신하는 표현 자 개체가 가비지 수집되지 않았습니다. 왜냐하면 나는 여전히 발표자에 대한 참조를 제거하지만 HandlerManager는 이러한 객체에 대한 참조를 보유하기 때문입니다. 그래서 매번 같은 클래스의 오래된 발표자들 위에 새로운 발표자를 계속해서 만들었습니다. 이벤트는 동일한 클래스의 여러 객체에 의해 수신됩니다. HandlerManager에서 등록 된 핸들러 을 제거하여 사용하지 않은 발표자가 가비지 수집되도록해야합니다.

0

예, 'addHandler'는 핸들러를 여러 번 추가하지만 이전 컨텍스트를 저장하는 것으로 보입니다. 코드는 초기화 단계에서 핸들러를 한 번만 추가해야합니다. 'getHandlerCount'메소드로 핸들러의 수를 확인할 수 있습니다.

관련 문제