2015-01-23 3 views
4

내 응용 프로그램에서 Greenrobot의 EventBus를 사용하고 있으며 정상적으로 작동합니다. 나는 응용 프로그램을 닫으려면 뒤로 버튼을 누르면여러 번 수신되는 이벤트 - Greenrobot eventbus

그러나, 나는 두 번 이벤트를받을 것으로 보인다 즉시 응용 프로그램을 다시 시작합니다. 그렇게하면 다시 3 번받을 것입니다.

로그 및 디버깅을 통해 클래스의 인스턴스가 여러 개 있는지 또는 여러 번 등록했는지 확인하고 있지만 추가 클래스가 표시되지 않고 isRegistered를 사용하면 false가 반환됩니다.

아이디어가 있으십니까?

감사합니다.

+0

코드를 게시 할 수 있습니까? –

+1

나는 crazymaik에 동의합니다 - 당신이 어딘가에서'unregister()'콜을 잃어 버렸다고 느낍니다. 당신의 프로세스가 여전히 주변에있는 한, 적어도 잠시 동안, BACK 버튼은 "앱을 닫지"않는다는 것을 명심하십시오. BACK은 전경 활동을 파괴합니다. – CommonsWare

답변

9

등록/등록 취소 전화가 올바르게 페어링 되었습니까? 예 : register()Activity.onResume() 인 경우 unregister()Activity.onPause()으로 호출 하시겠습니까? 당신의 프로세스를 종료하지 않는 모든 활동을 닫기

. 나는. 등록 된 모든 클래스가 여전히 존재할 경우, 이벤트 버스를 명시 적으로 정리하고 등록 취소하거나 Activity가 다시 돌아올 때 다시 등록해야합니다.

+0

당신이 옳다고 생각합니다. 나는 grep을했고 내 레지스터는 나의 등록자를 능가합니다. 그러나 올바르게 사용하고 있는지 확실하지 않습니다. 나는 분명히 원래 질문에 더 많은 정보를 추가해야한다. 순수한 Java로 작성된 LibGDX를 사용하여 게임을 작성하려고합니다. 이 repsect에서 나는 Activities/Fragments를 그런 식으로 사용하지 않고 어쩌면 나는 eventbus를 남용하고 있습니다. 나는 일반적인 자바 클래스에서 그것을 사용하고있다. 생성자에 등록 중이지만 등록을 취소 할 위치를 알지 못합니다. 클래스의 GC에서 호출되는 메소드를 인식하지 못합니까? –

+0

방금 ​​등록 취소하지 않은 클래스에서 isRegistered에 대한 호출을 추가했으며 여전히 등록되지 않았다는 것을 알 수있는 false를 수신하고 있습니까? 아니면 이것이 틀렸는가? 그리고 힙에 두 개의 클래스가있다. 오래된 클래스와 아직 등록되어 있지 않은 클래스가있다. –

+0

나는 그것이 효과가 있다고 생각한다. EventBus를 사용 중이며 활동이 아니거나 LibGDX dispose() 메소드가없는 모든 클래스에서 unRegister()라는 메서드를 추가했습니다. 그런 다음 게임을 종료했을 때 모든 항목이 등록되지 않았 음을 철저히 확인해야했습니다. 작동하는 것처럼 보이지만 그렇지 않은 경우 다시 알려 드리겠습니다. 감사합니다. –

2

이 오래된,하지만 단지의 경우 사람이이 문제를 가지고 트레드를 가볍게 조각 또는 다른 클래스와 같은 내부 EventBus 동적으로 생성 된 것을 사용하는 경우; 나는 왜 그들이 EventBus에 두 번 이상 게시했는지 이해하지 못했다. 그러나 나는 이것이 (둘 이상의 동적으로 생성 된 Fragment를 가졌음)해야한다고 생각한다. 나는 (또한 편리 onPause()onResume() 사용) 부모 활동 코드로 register(), unregister(), onEvent()을 넣어 일단 그것은 일반적으로 일했다.

0

이벤트가 실제로 여러 번 실행 된 것이 아니라 이지만 처리기가 여러 번 호출되었습니다. 위의 코드에서 볼 수 있듯이 bus.register 메서드는 객체를 만들 때마다 호출됩니다. 액티비티 라이프 사이클 때문에 여러 번 이런 일이 발생하여 핸들러가 여러 번 호출되었습니다.

관련 문제