2013-07-07 37 views
2

假設與類A以下情形,B和事件總線的實例(它可以是Guava event bus,由谷歌或Otto event bus,通過Squ.re)番石榴/奧托EventBus與空引用

class A{ 
    @Subscribe 
    public void onSomething(B event){ 
     //do something 
    } 
} 

A a = new A(); 
eventBus.subscribe(a); 
eventBus.post(new B()); 
// onSomething is called, everything ok 

a = null; 
eventBus.post(new B()); 
// onSomething is called again 

現在,如果我運行(只測試與奧托)onSomething被稱爲2次。

?事件總線是否會引用'a',直到取消註冊爲止?

而且更重要的是

¿如果由於某種原因,我無法確定在「a」將是空的那一刻,那麼事件總線將舉行一個無用的參考對象永遠(內存泄漏)?

回答

7

事件公交車將始終保持強有力的參考。這兩個問題的答案都是肯定的。

當您將上面的a設置爲null時,您僅清除本地引用。番石榴和奧托都保持強有力的參考,並要求明確註銷。您將在兩個事件總線中看到上述行爲。

我強烈建議您將對象的註冊綁定到除本地引用之外的其他內容。 Android活動和片段生命週期是一個明顯的選擇,類似closedestroy類似於單個對象的方法。