2012-08-09 64 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方法中,我要求獲取客戶數據的服務,如果搜索無效,則顯示彈出式錯誤消息。

即時通訊使用GXT 2.2.5和JRE 1.6。

任何人都可以幫我找出爲什麼代碼被執行多次?

後來增加: 當我第一次運行應用程序的代碼只執行一次,因此只有1彈出。然後,我退出系統並再次登錄(導航到「搜索客戶」按鈕所在的同一頁面),並且代碼被執行兩次。同樣等於我創建/導航到特定頁面的次數,代碼將執行。它是否實際上添加事件處理程序代碼而不刪除最後一次我重新創建頁面?

回答

0

雅。我修好了!這裏是解決方案Unbinding presenters necessary in GWT

你可以在這裏閱讀更多。 http://draconianoverlord.com/2010/11/23/gwt-handlers.html

實際發生的事情是,我向HandlerManager註冊的接收事件的主持人對象未被垃圾收集。因爲雖然我刪除了對演示者的引用,但HandlerManager仍然保存對這些對象的引用。所以每次我都會繼續在同一班的老主持人面前創建新的主持人。所以一個事件被同一個類的多個對象監聽。所以您需要確保未使用的演示者通過刪除HandlerManager中的註冊處理程序 進行垃圾收集。

0

是的,看起來'addHandler'多次​​添加處理程序,但存儲以前的上下文。在初始化階段,您的代碼應該只添加一次處理程序。您可以使用'getHandlerCount'方法檢查處理程序的數量。

相關問題