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);
}
}
}
어떻게 구아바는 매우 마지막 것을 알 수 : 서브 클래스라는를 사용하여 극약 처방 패턴에서 파생 나는이 패턴을 시도 –
@Pache 'eventBus.stopPosting (SomethingChangedEvent.class)'와 비슷한 것을 생각한 다음 마지막 호출 인'eventBus.resumePosting (SomethingChangedEvent.class)'바로 전에 생각했습니다. 이벤트 변경은 내 코드에 없기 때문에 옵션이 아닙니다. –
'IgnoreSomethingChangedEvent'와 같이'SomethingChangedEvent'를 확장 한 이벤트를 생성하여 eventBus에 게시 할 수 있습니다. 이 이벤트는 동일한 게시자가 수신하여 'ignoreSomethingChangedEvent' 인스턴스를 기반으로 내부 상태를 무시하도록 설정할 수 있습니다. 다른 이벤트를 만들어 다시 활성화하십시오. 그것은 복잡하지만 (테스트되고 작동하는) 유일한 방법 인 것처럼 보입니다. –