使用EventBus很久了,一直都没有写一篇与EventBus有关的博客,自己平时用但很多时候还经常忘记一些细节,所以今天写篇博客方便自己记忆一下,大神勿喷! 看这内容,您最好有个现成的EventBus的使用项目,不然看也没有眉目。
一、EventBus的使用
1.在需要接受消息的类里面,对EventBus进行注册。
EventBus.getDefault().register(this);
2.为了防止内存泄漏和遗忘,在该类的OnDestory()方法里面对EventBus进行解注册。
@Override
protected void onDestroy() {
super.onDestroy();
//结尾要进行解注册
EventBus.getDefault().unregister(this);
}
3.创建发送消息类
创建用到的一个类,里面声明属性,并创建够着方法和get\set方法。
public class FirstEvent {
private String mMsg;
/*
创建该类的构造器
*/
public FirstEvent(String mMsg) {
this.mMsg = mMsg;
}
public String getmMsg() {
return mMsg;
}
}
4.在发送消息类里面发送消息
btn_second.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
EventBus.getDefault().post(new FirstEvent("我发送了一段消息"));
}
});
5.注册监听,接受消息并显示
public void onEventMainThread(FirstEvent event){
String msg = "onEventMainThread收到了消息"+event.getmMsg();
tv_text.setText(msg);
Toast.makeText(MainActivity.this, "mag"+msg, Toast.LENGTH_SHORT).show();
}
二、EventBus的四种模式
在EventBus3.0里面,采用@Subscribe(threadMode =ThreadMode.MAIN) 这样的方式来进行订阅。
1.ThreadMode.MAIN 表示这个方法在主线程执行
首先去判断当前如果是UI线程,则直接调用;否则: mainThreadPoster.enqueue(subscription, event);把当前的方法加入到队列,然后直接通过handler去发送一个消息,在handler的handleMessage中,去执行我们的方法。说白了就是通过Handler去发送消息,然后执行的。
2.ThreadMode.BACKGROUND 表示这个方法在后台执行,不能并发处理。
如果当前非UI线程,则直接调用;如果是UI线程,则将任务加入到后台的一个队列,最终由Eventbus中的一个线程池去调用
executorService = Executors.newCachedThreadPool();。
3.ThreadMode.ASYNC 表示这个方法在后台执行,并且可以异步处理。
将任务加入到后台的一个队列,最终由Eventbus中的一个线程池去调用;线程池与BackgroundThread用的是同一个。
这么说BackgroundThread和Async有什么区别呢?
BackgroundThread中的任务,一个接着一个去调用,中间使用了一个布尔型变量handlerActive进行的控制。
Async则会动态控制并发。
4.ThreadMode.POSYING 表示该方法和消息发送方在同一个线程中执行
参考资料:
http://blog.youkuaiyun.com/lmj623565791/article/details/40920453