EventBus的使用想必大家也都有所瞭解了吧, 畢竟出來這麼多年了。 這裏我也再給大家做個簡單的介紹吧。
首先,先在接收類中 註冊:
EventBus.getDefault().register(this);
然後編寫Event實體類:
public class EventStudent { private int id; public int getId() { return id; } public void setId(int id) { this.id = id; } public EventStudent(int id){ this.id = id; } }
並在接收類中編寫參數給該實體類的方法(EventBus 是根據參數一致性來識別的):
@Subscribe(threadMode = ThreadMode.POSITION) public void receiverEventBus(EventStudent eventStudent){ LoggerDebug.d("----------------receiverEventBus" + eventStudent.getId()); if(null == eventStudent){ return ; } switch(eventStudent.getId()){ case 0: break; default: break; } }
接着在發送類中寫發送方法:
public class TestEventBus { public TestEventBus(){ } public void sendStudentEvent(){ new Thread(){ @Override public void run() { super.run(); } }.start(); EventBus.getDefault().post(new EventStudent(1)); } }
然後在你需要發送的地方,創建實例,調用方法即可發送。
最後記得在退出時要在註冊類中進行反註冊:
EventBus.getDefault().unregister(this);
否則下一次會收到重複的消息。
想必只要使用過EventBus的就會發現 我在接收方法中的tag上 有寫着這麼一句代碼
@Subscribe(threadMode = ThreadMode.POSITION)
大家可以通過按ctrl+點擊@Subscribe,進入源碼。 會發現其實@Subscribe 註解中有3個可用的抽象方法:
ThreadMode threadMode() default ThreadMode.POSTING;
boolean sticky() default false;
int priority() default 0;
第一個 threadMode表示的是 設置該接收方法運行的線程。
ThreadMode.POSITION 表示接收方法 和發送方 處於同一個線程;
ThreadMode.MAIN 表示 接收方法運行在Main線程中, 與發送方的線程沒有關係;
ThreadMode.BACKGROUND 表示 接收方法運行在後臺線程, 與發送方的線程沒有關係(就一個後臺線程);
ThreadMode.ASYNC 表示 接收方法強制運行在後臺線程, 與發送方的線程沒有關係(每個事件都會啓動一個線程);
第二個sticky,表示發送的是否是黏性事件。 默認爲false,表示不是, true表示是。
黏性事件的解釋爲:
Sticky Event是指我註冊一個sticky的訂閱,這樣註冊之前發送的sticky事件的最近的一個會保存在內存中,錯過這個事件的發送的情況下,也可以通過getStickyEvent收到。
postSticky(event) :發送sticky的event 。 註冊方法還是 register(subscriber) :註冊接收sticky事件的訂閱者。 獲取: getStickyEvent(Class);移除:removeStickyEvent(Obgect)
第三個priority 表示的是執行的優先級 , 值爲int類型
當一個類中有多個相同參數的接收方法時, 如果這幾個接收方法都跑在同一個線程中的話, 那麼priority值越大,優先級就越高,就越先執行。否則按照代碼的先後順序執行。
當一個是MAIN線程, 一個是非MAIN線程 時,在priority相同時,MAIN在前就先MAIN線程接收,否則隨機, 當MAIN的priority高時, 則一定是MAIN的先執行, 反之還是隨機。