简介
EventBus是一个消息总线,以观察者模式实现,用于简化程序的组件、线程通信,可以轻易切换线程、开辟线程。用于Activity,Fragment,Service,BroadCast等之间的通信。
EventBus 主要用来传递消息,可以代替Handle,callback,interface等。
使用
1 . 添加jar。
gradle中添加 compile 'org.greenrobot:eventbus:3.0.0'
2 . 应用
- 在当前添加绑定和解除绑定。
@Override
public void onCreate() {
super.onCreate();
//......
EventBus.getDefault().register(this);//添加绑定
}
@Override
public void onDestroy() {
super.onDestroy();
EventBus.getDefault().unregister(this);//解除绑定
}
- 发送消息
不管发布者是在主线程还是子线程,发布的消息在所有定义好的实体类型订阅者中都可以接收到消息。也就是,可以实现一个订阅者订阅多个事件,和一个事件对应多个订阅者。(参考别人的)
//发送一次
EventBus.getDefault().post(obj)
//发送多次
EventBus.getDefault().postSticky(obj);
接收消息
EventBus3.0有以下四种接收ThreadMode
POSTING(默认):事件在哪个线程发布出来的,事件处理函数就会在这个线程中运行。
MAIN: 主线程中运行,主要用来up UI。
BACKGROUND:如果事件是在主程中发布,那么创建新的子线程中运行,如果事件是子线程中发布的,则在当前线程处理。在此事件处理函数中禁止进行UI更新操作。
ASYNC:无论事件在哪个线程发布,该事件处理函数都会在新建的子线程中执行,同样,此事件处理函数中禁止进行UI更新操作。这里直接以传递Message对像为例
/**
* 默认的线程模式,在当前线程下运行。如果当前线程是子线程则在子线 程中,当前线程是主线程,则在主线程中执行。
* @param event
*/
@Subscribe(threadMode = ThreadMode.POSTING)
//发送多次
/*@Subscribe(threadMode = ThreadMode.MAIN,sticky = true)*/
public void onMessage(Message event) {
//方法名自己定义,添加注解就好
//......
}
/**
* 在主线程中运行
* @param event
*/
@Subscribe(threadMode = ThreadMode.MAIN)
public void onMessage(Message event) {
//...... 更新ui
}
/**
* 在后台线程中执行,如果当前线程是子线程,则会在当前线程执行,如果当前线程是主线程,则会创建一个新的子线程来执行
* @param event
*/
@Subscribe(threadMode = ThreadMode.BACKGROUND)
public void onEventBackgroundThread(Message event){
//......
}
/**
* 创建一个异步线程来执行
* @param event
*/
@Subscribe(threadMode = ThreadMode.ASYNC)
public void onEventAsync(Message event){
//......
}
完整代码
实现:主界面点击,发送多次事件,实现打开Activity,并且在Activity中显示发送的Message内容。
主界面代码:
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
EventBus.getDefault().register(this);//添加绑定
findViewById(R.id.tv_selfview).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//发送message为例,带有what和obj,这样以后可以通过what来区分类型
EventBus.getDefault().postSticky(Message.obtain(null, 0x01, "Test"));
}
});
}
/**
* 发送消息的接收时间,名称自定义,添加注解
* 注解是通过反射的方式实现
* @param event
*/
@Subscribe(threadMode = ThreadMode.MAIN,sticky = true)
public void onMoonEvent(Message event) {
startActivity(new Intent(getApplicationContext(), PostTestActivity.class));
}
@Override
protected void onDestroy() {
super.onDestroy();
EventBus.getDefault().unregister(this);//解除绑定
}
}
secondActivity代码实现
public class PostTestActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_post_test);
EventBus.getDefault().register(this);//添加绑定
}
@Subscribe(threadMode = ThreadMode.MAIN,sticky = true)
public void onMessage(Message event) {
((TextView) findViewById(R.id.tv_showInfo)).setText(event.obj.toString());
}
@Override
protected void onDestroy() {
super.onDestroy();
EventBus.getDefault().unregister(this);//解除绑定
}
}
以上就是EventBus的简单应用,适合于发送替换广播,Handler,Service通信等。