EventBus使用詳解

EventBus是針一款對Android的發佈/訂閱事件總線。它可讓咱們很輕鬆的實如今Android各個組件之間傳遞消息,而且代碼的可讀性更好,耦合度更低。長話短說直接介紹使用。git

如何使用 (如下介紹一下 活動和intentService之間的通訊)

(1)首先須要定義一個消息類,該類能夠不繼承任何基類也不須要實現任何接口。我是單獨建一個文件存放這個類 如:

public class MessageEvent {

    private String message;

    public MessageEvent(String message) {
        this.message = message;
    }

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }
}

(2)在須要訂閱事件的地方註冊事件

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //註冊事件
        EventBus.getDefault().register(this);  //這裏是註冊事件  請注意這裏


        Button startService = (Button) findViewById(R.id.startIntentService);
        startService.setOnClickListener(this);

        SpeechUtility. createUtility(this, SpeechConstant. APPID + "=5b02688c" );

        handler=new Handler();
        handler.postDelayed(runnable, 1000);//每1秒執行一次runnable.

//        startMyService(getApplicationContext());

    }

(3)產生事件,即發送消息 (在 intentService 裏面須要發送數據的地方 發送消息)

 EventBus.getDefault().post(new MessageEvent("problem:"+textString));

(4)處理消息  (在activity 裏面接收消息 而且處理 我只是顯示出來了)

 
@Subscribe(threadMode = ThreadMode.MainThread)
public void onMessageEventMainThread(MessageEvent messageEvent) {
    Log.i("MainThread", messageEvent.getMessage());
    Toast.makeText(this,  messageEvent.getMessage(), Toast.LENGTH_SHORT).show();

}
 

(5)取消消息訂閱(在活動結束的時候 取消消息訂閱)

    @Override
    protected void onDestroy() {
        super.onDestroy();
        //取消事件註冊
        EventBus.getDefault().unregister(this);

    }

線程模型

在EventBus的事件處理函數中須要指定線程模型,即指定事件處理函數運行所在的想線程。在上面咱們已經接觸到了EventBus的四種線程模型。那他們有什麼區別呢?
在EventBus中的觀察者一般有四種線程模型,分別是PostThread(默認)、MainThread、BackgroundThread與Async。github

  • PostThread:若是使用事件處理函數指定了線程模型爲PostThread,那麼該事件在哪一個線程發佈出來的,事件處理函數就會在這個線程中運行,也就是說發佈事件和接收事件在同一個線程。在線程模型爲PostThread的事件處理函數中儘可能避免執行耗時操做,由於它會阻塞事件的傳遞,甚至有可能會引發ANR。
  • MainThread:若是使用事件處理函數指定了線程模型爲MainThread,那麼不論事件是在哪一個線程中發佈出來的,該事件處理函數都會在UI線程中執行。該方法能夠用來更新UI,可是不能處理耗時操做。
  • BackgroundThread:若是使用事件處理函數指定了線程模型爲BackgroundThread,那麼若是事件是在UI線程中發佈出來的,那麼該事件處理函數就會在新的線程中運行,若是事件原本就是子線程中發佈出來的,那麼該事件處理函數直接在發佈事件的線程中執行。在此事件處理函數中禁止進行UI更新操做。
  • Async:若是使用事件處理函數指定了線程模型爲Async,那麼不管事件在哪一個線程發佈,該事件處理函數都會在新建的子線程中執行。一樣,此事件處理函數中禁止進行UI更新操做。
相關文章
相關標籤/搜索