EventBus的使用及接收消息的四种模式介绍

使用EventBus很久了,一直都没有写一篇与EventBus有关的博客,自己平时用但很多时候还经常忘记一些细节,所以今天写篇博客方便自己记忆一下,大神勿喷! 看这内容,您最好有个现成的EventBus的使用项目,不然看也没有眉目。
一、EventBus的使用
1.在需要接受消息的类里面,对EventBus进行注册。
EventBus.getDefault().register(this);

2.为了防止内存泄漏和遗忘,在该类的OnDestory()方法里面对EventBus进行解注册。
@Override
protected void onDestroy() {
super.onDestroy();
//结尾要进行解注册
EventBus.getDefault().unregister(this);
}

3.创建发送消息类
创建用到的一个类,里面声明属性,并创建够着方法和get\set方法。
public class FirstEvent {

private String mMsg;

/*
创建该类的构造器
 */
public FirstEvent(String mMsg) {
    this.mMsg = mMsg;
}

public String getmMsg() {
    return mMsg;
}

}

4.在发送消息类里面发送消息

    btn_second.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            EventBus.getDefault().post(new FirstEvent("我发送了一段消息"));
        }
    });

5.注册监听,接受消息并显示
public void onEventMainThread(FirstEvent event){

    String msg = "onEventMainThread收到了消息"+event.getmMsg();

    tv_text.setText(msg);
    Toast.makeText(MainActivity.this, "mag"+msg, Toast.LENGTH_SHORT).show();

}

二、EventBus的四种模式
在EventBus3.0里面,采用@Subscribe(threadMode =ThreadMode.MAIN) 这样的方式来进行订阅。
1.ThreadMode.MAIN 表示这个方法在主线程执行
首先去判断当前如果是UI线程,则直接调用;否则: mainThreadPoster.enqueue(subscription, event);把当前的方法加入到队列,然后直接通过handler去发送一个消息,在handler的handleMessage中,去执行我们的方法。说白了就是通过Handler去发送消息,然后执行的。
2.ThreadMode.BACKGROUND 表示这个方法在后台执行,不能并发处理。
如果当前非UI线程,则直接调用;如果是UI线程,则将任务加入到后台的一个队列,最终由Eventbus中的一个线程池去调用

executorService = Executors.newCachedThreadPool();。
3.ThreadMode.ASYNC 表示这个方法在后台执行,并且可以异步处理。
将任务加入到后台的一个队列,最终由Eventbus中的一个线程池去调用;线程池与BackgroundThread用的是同一个。

这么说BackgroundThread和Async有什么区别呢?

BackgroundThread中的任务,一个接着一个去调用,中间使用了一个布尔型变量handlerActive进行的控制。
Async则会动态控制并发。

4.ThreadMode.POSYING 表示该方法和消息发送方在同一个线程中执行

参考资料:
http://blog.csdn.net/lmj623565791/article/details/40920453

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
EventBus是一个轻量级的事件发布/订阅库,可以方便地实现组件之间的通信。它可以大大简化应用程序中的消息传递,减少了代码的耦合度,从而提高了应用程序的可维护性和可扩展性。 使用EventBus,你需要在你的项目中添加EventBus库的依赖。在gradle配置文件中添加如下代码: ```groovy dependencies { implementation 'org.greenrobot:eventbus:3.2.0' } ``` 然后,你需要定义你的事件类,例如: ```java public class MessageEvent { public final String message; public MessageEvent(String message) { this.message = message; } } ``` 接下来,订阅者需要在其onCreate()方法中注册到EventBus中: ```java @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); EventBus.getDefault().register(this); } ``` 然后,你可以在订阅者中定义事件处理方法: ```java @Subscribe(threadMode = ThreadMode.MAIN) public void onMessageEvent(MessageEvent event) { Toast.makeText(this, event.message, Toast.LENGTH_SHORT).show(); } ``` 最后,当你想要发送一个事件时,你可以使用EventBus的post()方法: ```java EventBus.getDefault().post(new MessageEvent("Hello world!")); ``` 这个事件将被所有订阅者接收,并且可以在onMessageEvent()方法中处理。需要注意的是,当你不再需要接收事件时,你需要在onDestroy()方法中注销订阅者: ```java @Override protected void onDestroy() { super.onDestroy(); EventBus.getDefault().unregister(this); } ``` 这就是使用EventBus的基本方法。当然,EventBus还有很多高级用法,比如可以指定事件的优先级、自定义线程模式等等。你可以查看官方文档来了解更多信息。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值