第一步:在build.gradle加入
compile 'org.greenrobot:eventbus:3.0.0'
然后重新编译工程:注意如果正式使用时,提示找不到EventBus则使用以下处理办法:
没有效果,添加依赖失败,没有一点反应,后来看stackoverflow 说,在allprojects的repositories下面加入 “mavenCentral()”
先开始也是没有效果,后来,重启了Android,然后就可以了,之前好多遍rebuild都不管用
第二步:定义消息类
public class MessageEvent { public int pos; public String cityId; public MessageEvent(int pos , String cityId) { this.pos = pos;//用于标记是发给哪个接收者的,如果同一个消息有多个接收者 this.cityId = cityId; } }
第三步:编写发送消息的代码
比如点击按键,然后发送消息,或者,其他库的回调函数发送此消息,上面的类的定义可以和发消息的类定义到同一个文件里面
EventBus.getDefault().post(new MessageEvent(1,“id”);第四步:编写接收者部分(接收者和发送者都可以是任意线程,任意activity,fragment
// 当MessageEvent被当做参数发送的时候这个方法将会被触发. @Subscribe(threadMode = ThreadMode.MAIN) //表示消息接收函数运行在ui线程,即可以直接操作界面显示 public void onMessageEvent(MainActivity.MessageEvent event) { //Toast.makeText(getActivity(), "from fragment: "+event.pos, Toast.LENGTH_SHORT).show(); if (indexOfFragment == event.pos) { // the current page is been selected//当有多个接收者用编号区分是否发给自己的消息 System.out.println("the current page is been selected page is "+ event.pos); //only do this on current page //todo send update ui msg } }第五步:注册接受者
在这之上知识准备好接收者,但是还没有注册到eventbus,因此还不会收到消息
在接收函数所在的类里面,注册接收者,比如在Fragmet或activity里面
@Override public void onPause() { super.onPause(); EventBus.getDefault().unregister(this); System.out.println("fragment ::::: un register"+this); } @Override public void onResume() { super.onResume(); EventBus.getDefault().register(this); System.out.println("fragment ::::: register address:" + this); }这里注意不要在onStart和onStop里面做,具体原因没有分析,但是使用onStart和onStop在使用时会出现,接收到消息,ui不更新的现象(接收者在fragment里面)