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更新操作。