EventBus 使用進階

    


      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的先執行, 反之還是隨機。



 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章