EventBus使用詳解
阿新 • • 發佈:2018-06-03
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使用詳解