2012-11-08 2 views
3

구바 라이브러리에서 EventBus에 의한 이벤트 게시를 일시 중지 할 수있는 방법이 있습니까?구아바 EventBus : 이벤트 게시 일시 중지

이벤트 (예 : SomethingChangedEvent)를 게시하는 changeSomething() 메소드가 있습니다. 이제이 메서드는 다른 메서드 doStuff()에 의해 루프에서 호출됩니다. 문제는 마지막 변경 사항 만 중요하더라도 changeSomething()에 대한 모든 호출에 SomethingChangedEvent이 게시된다는 것입니다. 이벤트 처리기가 일부 중량 계산을 실행하기 때문에 응용 프로그램의 성능이 빠르게 저하됩니다.

마지막으로 changeSomething()이 실행 된 후에 구아바에게 이벤트 처리를 재개하라고 말하고 싶습니다.

구아바에게 마지막 부분을 제외한 모든 SomethingChangedEvent을 무시하도록 할 수있는 방법이 있습니까?

public class SomethingChangedEvent { 

     private final String name; 

     public SomethingChangedEvent(String name) { 
      this.name = name; 
     } 

     @Override 
     public String toString() { 
      return name; 
     } 

    } 

    public class IgnoreSomethingChangedEvent extends SomethingChangedEvent { 
     public IgnoreSomethingChangedEvent(String name) { 
      super(name); 
     } 

    } 

    public class HandleSomethingChangedEvent extends SomethingChangedEvent { 
     public HandleSomethingChangedEvent(String name) { 
      super(name); 
     } 

    } 

    private void eventBusTest() { 
     EventBus eventBus = new EventBus(); 
     eventBus.register(new EventBusSomethingChanged()); 
     eventBus.post(new SomethingChangedEvent("process this one")); 
     eventBus.post(new IgnoreSomethingChangedEvent("ignore")); 
     eventBus.post(new SomethingChangedEvent("don't process this one")); 
     eventBus.post(new HandleSomethingChangedEvent("handle")); 
     eventBus.post(new SomethingChangedEvent("process this one bis")); 
    } 

    public class EventBusSomethingChanged { 
     private boolean ignore; 

     @Subscribe 
     public void SomethingChanged(SomethingChangedEvent e) { 
      if (e instanceof IgnoreSomethingChangedEvent) { 
       ignore = true; 
       return; 
      } 
      if (e instanceof HandleSomethingChangedEvent) { 
       ignore = false; 
       return; 
      } 
      if (!ignore) { 
       System.out.println("processing:" + e); 
      } 
     } 
    } 
+0

어떻게 구아바는 매우 마지막 것을 알 수 : 서브 클래스라는를 사용하여 극약 처방 패턴에서 파생 나는이 패턴을 시도 –

+0

@Pache 'eventBus.stopPosting (SomethingChangedEvent.class)'와 비슷한 것을 생각한 다음 마지막 호출 인'eventBus.resumePosting (SomethingChangedEvent.class)'바로 전에 생각했습니다. 이벤트 변경은 내 코드에 없기 때문에 옵션이 아닙니다. –

+0

'IgnoreSomethingChangedEvent'와 같이'SomethingChangedEvent'를 확장 한 이벤트를 생성하여 eventBus에 게시 할 수 있습니다. 이 이벤트는 동일한 게시자가 수신하여 'ignoreSomethingChangedEvent' 인스턴스를 기반으로 내부 상태를 무시하도록 설정할 수 있습니다. 다른 이벤트를 만들어 다시 활성화하십시오. 그것은 복잡하지만 (테스트되고 작동하는) 유일한 방법 인 것처럼 보입니다. –

답변

2

? 이벤트에 판별자를 추가하고 구독자 측에서이 필터를 수동으로 필터링해야합니다.
관련 문제