1. 程式人生 > >EventBus使用詳解

EventBus使用詳解

private 不能 get layout 繼承 protected 耦合 ide state

EventBus是針一款對Android的發布/訂閱事件總線。它可以讓我們很輕松的實現在Android各個組件之間傳遞消息,並且代碼的可讀性更好,耦合度更低。長話短說直接介紹使用。

如何使用 (以下介紹一下 活動和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。

  • PostThread:如果使用事件處理函數指定了線程模型為PostThread,那麽該事件在哪個線程發布出來的,事件處理函數就會在這個線程中運行,也就是說發布事件和接收事件在同一個線程。在線程模型為PostThread的事件處理函數中盡量避免執行耗時操作,因為它會阻塞事件的傳遞,甚至有可能會引起ANR。
  • MainThread:如果使用事件處理函數指定了線程模型為MainThread,那麽不論事件是在哪個線程中發布出來的,該事件處理函數都會在UI線程中執行。該方法可以用來更新UI,但是不能處理耗時操作。
  • BackgroundThread:如果使用事件處理函數指定了線程模型為BackgroundThread,那麽如果事件是在UI線程中發布出來的,那麽該事件處理函數就會在新的線程中運行,如果事件本來就是子線程中發布出來的,那麽該事件處理函數直接在發布事件的線程中執行。在此事件處理函數中禁止進行UI更新操作。
  • Async:如果使用事件處理函數指定了線程模型為Async,那麽無論事件在哪個線程發布,該事件處理函數都會在新建的子線程中執行。同樣,此事件處理函數中禁止進行UI更新操作。
 

EventBus使用詳解