EventBus使用及简析

来源:互联网 发布:怎么运营好淘宝店铺 编辑:程序博客网 时间:2024/04/28 08:40

欢迎转载.请注明出处

前言 

再网上发现有关EventBus的文章大都停留在较老旧的版本,而新版本又与之出入较大,于是本着自己总结,方便他人的原则编辑本文,如有

EventBus 轻量级的用于通信的工具,用于Activity 服务之间通信,亦可用于不同线程间通信,可以方便的替代原先需要依靠广播(更消耗资源)进行的通信

EventBus.getDefault() 即可获得一个单例, 和getInstance是一个意思,所以不必要new


1)简单使用

先上图,这里达到的效果就是在b Activity中发送更改的请求,a Activity接受并更新UI,弹吐司


两个Activity的布局非常简单不在赘述, 直接说怎么实用eventBus发送接受消息

compile 'org.greenrobot:eventbus:3.0.0'
1).注册接受消息的Activity中初始化 eventBus,并对eventBus进行生命周期的管理防止内存泄露

在接受消息的activity的onCreate方法中调用

    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        //注册Event        EventBus.getDefault().register(this);        //初始化控件        initView();    }
②在onDestroy方法中

    @Override    protected void onDestroy() {        EventBus.getDefault().unregister(this);        super.onDestroy();    }
2)在发送者的activity的按钮点击事件中调用发送消息的方法

①先写一个javaBean作为消息发送的对象

public class FirstEvent {    private String mMsg;    public FirstEvent(String msg) {        mMsg = msg;    }    public String getMsg(){        return mMsg;    }}

②发送消息

findViewById(R.id.btn_first_event).setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {                EventBus.getDefault().post(new FirstEvent("炸酱面"));            }        });
3)在接受者的activity中一个方法,在3.0的版本以后EventBus允许方法名是任意的,只要在发放前加注解 @Subscribe便可,但是方法的声明必须是 public

   

<span style="font-family: "microsoft yahei"; font-size: 18px; line-height: 26px; background-color: rgb(240, 240, 240);">@Subscribe</span>
public void acceptMsg(FirstEvent msg){        Toast.makeText(getApplicationContext(),msg.getMsg() , Toast.LENGTH_SHORT).show();        tv.setText(msg.getMsg());    }

至此EventBus就算是用起来了


到这里童鞋们可能就有疑问了,如果消息众多,那怎么区分发送的消息是否是我想要的呢?

EventBus 3.0是通过注解的形式找到方法,在通过方法中接受的消息对象来区分,所以你如果想接受某一类型的消息只要吧方法的参数写成相符合的就好,想来还是比较简单方便的就不上代码了


在说一点小小的进阶,EventBus 每一个事件处理函数都有自己的线程模式,这个模式决定了处理函数在哪个线程中执行,这四种线程模式分别是

1. MAIN  模式 
事件处理方法将会在android的主线程中被调用
如果 post thread 发送事件的线程也是主线程
事件处理方法会直接被调用,使用这种方法需要避免
阻塞线程 avoid 耗时操作

2. POSTING 模式
事件处理方法执行在时间发布的线程中 默认是 POSTING 模式 
如果主线程发布事件采用的是默认模式,事件处理方法也要
避免耗时操作 avoid 阻塞
适合用于一些会很快完成的任务

3. BACKGROUND 模式
如果事件发起线程不是主线程, 事件处理者会被直接调用
如果是主线程,会使用给一个后台线程来执行,
所有使用这种模式的事件处理方法都会在这个后台线程中执行
所以要避免执行耗时操作,导致阻塞其他的后台处理事件

4. ASYNC 模式
加入到一个特殊的线程中, 事件发起线程不会等待事件
处理者的,两边同步执行, 使用这种模式执行耗时操作。
但是要避免同一时间触发大量的同步线程,为了限制当前
的线程数量, 用的是线程池

在注解时可以指定模式的使用,默认是POSTING 模式

1 0
原创粉丝点击