EventBus的使用及实现原理

本文介绍了EventBus的使用优势,包括其简化组件间通信的特性,以及在Android应用中的常见使用场景。详细讲解了EventBus的基本使用步骤,如注册、注销、事件定义和发布。此外,还探讨了自定义实现EventBus,通过四个关键类(ThreadMode、Subscribe、EventBus和MethodManager)来理解其内部工作原理。
摘要由CSDN通过智能技术生成

1.EventBus的介绍与使用

1.1常见的组件间的通信方式
  • Intent:跳转+传参(局限性非常大)
  • Handler:通常用来更新主线程UI,使用不当容易出现内存泄露
  • Interface:接口回调,仅限于同一线程中数据交互
  • BroadcastReceiver:有序广播+无序广播
  • AIDL:跨进程通信,代码阅读性不友好,维护成本偏高
EventBus优点
  • 代码简单,快
  • Jar包小,~50k
  • Activity,Fragment以及线程通信优秀
  • 稳定,在一亿+应用中得到实践
1.2EventBus定义

EventBus是一个Android优化的publish/subscribe消息事件总线,简化了应用程序内各个组件间、组件与后台线程间的通信。如Activites、Fragments、Threads、Services

1.3使用场景

比如网络请求,返回时通过Handler或者BroadCastReceiver通知更新主线程UI

N个Fragment之间需要通过Listener(监听)通信

这些需求都可以通过EventBus完成和实现。可以在任何地方发布事件,任何地方订阅消费事件。完美的简化了跨组件、跨线程等方面通信的问题。

1.4官方架构图

在这里插入图片描述

1.5简单使用
  • 导入EventBus库:implementation ‘org.greenrobot:eventbus:3.1.1’

  • 注册和注销

    @Override
    protected void onCreate() {
         
        super.onStart();
        EventBus.getDefault().register(this);
    }
    
    
    @Override
    protected void onDestroy() {
         
        super.onStop();
        if (EventBus.getDefault().isRegistered(this)) {
         
        	EventBus.getDefault().unregister(this);
        }
    }
    
  • 官方三步曲

    • 定义事件

      public class MessageEvent {
          /*Additional fields if needed*/
      }
      
    • 订阅事件(注解+方法指定参数)

      @Subscribe(threadMode = ThreadMode.MAIN)
      public void onMessageEvent(MessageEvent event) {
          /*Do something*/
          //监听到了发布的事件(消息)
          //进行相关操作,比如更新UI等
      }
      
    • 发布事件(发送消息)

      EventBus.getDefault().post(new MessageEvent());
      
  • EventBus粘性事件(@Subscribe注解中加入:sticky = true 作用:延时消费或者初始化)

    @Subscribe(threadMode = ThreadMode.MAIN, sticky = true)
    public void onMessageEvent(UserInfo user) {
         
        Log.d(TAG, user.toString());
        /*Do something*/
        //监听到了发布的事件(消息)
        //进行相关操作,比如更新UI等
        //如果请求接口然后再发送事件再进行控件的更新。有时候该控件所在的页面可能没有初始化好。	
        //这时候eventbus所发送的事件就不会起作用。这时候就要用到粘性事件。粘性事件可以先发送     
        //事件,待接收方订阅后接受事件。其实就是解决异步所带来的问题
    }
    
  • 订阅方法执行的优先级(如果两个或多个地方订阅同一事件,优先级高的先接收)

    @Subscribe(threadMode = ThreadMode.MAIN, priority = 1)
    public void onMessageEvent(UserInfo user) {
         
        //消费事件/消息
        textView.setText(user.toString());
        Log.d(TAG, "onMessageEve
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值