greenrobot EventBus 使用实践

第一步:在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里面)


你可能感兴趣的:(Android)