EventBus使用及简析

欢迎转载.请注明出处

前言 

再网上发现有关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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值