2015-12-20 36 views
3

我在我的Android應用程序中使用Otto事件總線。我已閱讀GitHub文檔以及在線發佈的有關等級遍歷如何工作的各種問題:我可以在基礎課程和孩子課程上註冊一輛Otto巴士嗎?

「註冊將只在直接類類型上找到方法。與Guava事件總線不同,Otto不會遍歷類層次結構並添加從基類或接口註釋的方法「

我知道如果我註冊一個子類的總線,然後從基類的方法將不會被添加。所以我的問題是,我可以在兒童班註冊一輛公共汽車,並在基礎班註冊另一輛公共汽車嗎?

public class BaseActivity extends Activity 
    ... 
    baseBus.register(this); 

    @Subscribe public void baseAnswerAvailable(BaseAnswerAvailableEvent event) { 
     // TODO: React to the event somehow in the base class 
    } 

public class MainActivity extends BaseActivity 
    ... 
    bus.register(this); 

    @Subscribe public void answerAvailable(AnswerAvailableEvent event) { 
     // TODO: React to the event somehow 
    } 

都將在baseAnswerAvailable和answerAvailable方法被調用?

回答

0

通常不回答我沒有回答的問題,但是因爲有人高舉我的問題,我覺得這會有所幫助。我想兩個孩子和基類生產活動:

@Produce 
public BaseAnswerAvailableEvent baseAnswerAvailableEvent() { 
    return new BaseAnswerAvailableEvent(message); 
} 

@Produce 
public AnswerAvailableEvent answerAvailableEvent() { 
    return new AnswerAvailableEvent(message); 
} 

答案是否定的,你不能產生並訂閱基地和子類獨立的事件。我生成了這兩個事件,並且只有子類中的AnswerAvailableEvent接收了一個事件。

1

的答案是肯定的實際上,這裏就是這樣

https://github.com/square/otto/issues/26#issuecomment-33891598

public class ParentActivity extends Activity { 
protected Object busEventListener; 

@Override 
protected void onCreate(final Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    busEventListener = new Object() { 
     @Subscribe 
     public void onReceiveLoginEvent(final LoginEvent event) { 
      ParentActivity.this.onReceiveLoginEvent(event); 
     } 
     @Subscribe 
     public void onReceiveLogoutEvent(final LogoutEvent event) { 
      ParentActivity.this.onReceiveLogoutEvent(event); 
     } 
    }; 

    BusProvider.getInstance().register(busEventListener); 
} 

//subclasses extend me. This can be abstract, if necessary. 
protected void onReceiveLoginEvent(final LoginEvent event) { 
    Log.d("Tag", "LoginEvent"); 
} 

//subclasses extend me. This can be abstract, if necessary. 
protected void onReceiveLogoutEvent(final LogoutEvent event) { 
    Log.d("Tag", "LogoutEvent"); 
} 

@Override 
protected void onDestroy() { 
    super.onDestroy(); 
    BusProvider.getInstance().unregister(busEventListener); 
} 
}