EventBus
EventBus是針一款對Android的發布/訂閱事件總線。它可以讓我們很輕松的實現在Android各個組件之間傳遞消息,并且代碼的可讀性更好,耦合度更低。
使用步驟
首先需要定義一個事件,如:
public class MyEvent{
//這里面可以寫需要調用的數據
}在需要訂閱事件的地方注冊事件,如:
EventBus.getDefault().register(this);產生事件,即發送事件,如:
EventBus.getDefault().post(myEvent);處理事件,在接受訂閱事件的地方處理獲取的事件,如:
public void onEventMainThread(Event e){}取消消息訂閱,如:
EventBus.getDefault().unregister(this);
使用以上步驟就可以處理好一個普通的事件了。
特別場景
由于我們注冊事件的時候基本上是在onCreateView()或者在onCreate()方法中,這回導致有時候我們的代碼里接收不到發送來的事件。比如:當你在BActivity中的onCreate()中注冊了事件,你再AActivity中post一個事件,但是由于你的BActivity
沒有創建,那么你就不會接收到事件,這時候就要使用粘性事件了。
Stickey事件使用步驟
- 定義好一個事件,如:public class MyEvent{
//這里面可以寫需要調用的數據
} - 在需要訂閱的地方訂閱,如: EventBus.getDefault().registerSticky(this);此時訂閱這個事件,如果此activity沒有被創建,是不會走這個方法的,因此需要步驟三
- onEventMainThread(EventBus.getDefault().getStickyEvent(MyEvent.class));主動獲取事件
- public void onEventMainThread(GotoMaterialEvent event) {//對事件進行處理}
- 發送粘性事件 EventBus.getDefault().postSticky(new MyEvent());
由上面就可以完成黏性事件的處理了。
下面請看我的代碼:
- 定義一個事件
public class GotoMaterialEvent extends BaseEvent {
private int page;
private int item;
public GotoMaterialEvent(int page) {
this.page = page;
}
public int getPage() {
return page;
}
public void setPage(int page) {
this.page = page;
}
public int getItem() {
return item;
}
public void setItem(int item) {
this.item = item;
}
}
- 訂閱事件
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
EventBus.getDefault().registerSticky(this);
return super.onCreateView(inflater, container, savedInstanceState);
}
- 主動獲取事件
onEventMainThread(EventBus.getDefault().getStickyEvent(GotoMaterialEvent.class));
- 事件處理
public void onEventMainThread(GotoMaterialEvent event) {
int id = event.getItem();
for (int i = 0; i < categroyIds.size(); i++) {
if (id == categroyIds.get(i)) {
//公開課
indicatorViewPager.setCurrentItem(i, true);
} else if (id == categroyIds.get(i)) {
//什么事acca
indicatorViewPager.setCurrentItem(i, true);
} else if (id == categroyIds.get(i)) {
//新手指南
indicatorViewPager.setCurrentItem(i, true);
}
}
}
- 發送事件
ll_home_acca_1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
GotoMaterialEvent event = new GotoMaterialEvent(2);
event.setItem(2);
EventBus.getDefault().postSticky(event);
}
});