2010-04-10 4 views
12

이벤트를 처음 수신 할 때 GWT 이벤트 처리기를 제거하려고합니다. 또한 실제로 필요하지 않은 등록 개체를 추적하여 클래스를 오염시키지 않으려합니다. 나는 현재 그것은으로 코딩 한 :첫 번째 이벤트 알림에서 GWT removeHandler

final HandlerRegistration[] registrationRef = new HandlerRegistration[1]; 
registrationRef[0] = dialog.addFooHandler(new FooHandler() 
{ 
    public void onFoo(FooEvent event) 
    { 
     HandlerRegistration removeMe = registrationRef[0]; 
     if(removeMe != null) 
     { 
      removeMe.removeHandler(); 
     } 

     // do stuff here 
    } 
});

하지만 registrationRef의 사용은 코드가 덜 읽을 수 있습니다. 클래스에 변수를 추가하지 않고이 작업을 수행하는 더 좋은 방법이 있습니까?

답변

11

난 그냥 둘러싸는 클래스의 필드 HandlerRegistration 개체를 만드는 것, 그런 식으로 컴파일러에 의해 방해되지 않고는 배열과 물건 셔플보다 더 많은 "우아한"입니다 :

public class TestWidget extends Composite { 
    //... 

    HandlerRegistration handler; 

    public TestWidget() { 
     // ... 

     handler = button.addClickHandler(new ClickHandler() { 
      @Override 
      public void onClick(ClickEvent event) { 
       // ... 
       handler.removeHandler();     
      } 
     }); 
    } 

} 
+0

예를, 감사. 이 클래스의 리스너 중 하나만 가지고있을 때 (이 방법으로 처리하는 임의의 수의 위젯을 가지고있을 때 상황이 더 지저분해질 때)이 방법을 사용할 수 있습니다. 새로운 필드를 추가하지 않고이 작업을 수행 할 수있는 방법이 있었으면합니다. 오 잘 ... – Keith

+0

이것은 보이는 것처럼 직선적이지 않을 수 있습니다. onXXX() 메서드에서 핸들러가 null로 설정된 경우가 있습니다. 왜? GWT가 핸들러를 바로 호출하는 것을 막을 수있는 것이 아무 것도 없기 때문입니다. 예를 들어 Image.onLoad()의 IE 경우 이미지가 이미로드 된 경우 실제로 addLoadHandler()를 호출하는 동안 핸들러를 호출 할 수 있습니다. 이 경우 유일한 수정은 "if null"체크를 랩핑 한 다음 나중에 정리하는 것이 었습니다. – John

+2

핸들러를 여러 번 추가 할 수있는 경우에는 작동하지 않습니다. – ubiquitousthey