EventBus总结
EventBus使用分为四个步骤:
- (EventBusIndex)项目编译期可以利用APT预解析带@Subscribe的类,减少运行时分发事件的时间,但这步也是可以选择不做的。
- (Register)注册需要监听的类到EventBus里面
- (post/postSticky)任何地方都可以发布事件,事件分为两种,普通事件和sticky事件,后者主要的作用是事件发送之后新订阅这个事件的类会拿到上一个同类型的事件
- (unregister)Register的类记得要在销毁的地方做unregister,不然会造成内存泄漏
EventBus的核心原理:
1.通过注解的方式注册监听回调方法
2.监听者可以设置优先级
3.维护类许多Cache缓存解析过的数据,不用重复查找
4.添加sticky功能,使刚注册的对象能拿到监听类型前面发布过的事件
5.事件也可以通知到监听事件父类事件的方法
6.监听回调可以设置在不同线程响应
eventBus四种线程模型:
- POSTING (默认) 表示事件处理函数的线程跟发布事件的线程在同一个线程。
- MAIN 表示事件处理函数的线程在主线程(UI)线程,因此在这里不能进行耗时操作。
- BACKGROUND 表示事件处理函数的线程在后台线程,因此不能进行UI操作。如果发布事件的线程是主线程(UI线程),那么事件处理函数将会开启一个后台线程,如果果发布事件的线程是在后台线程,那么事件处理函数就使用该线程。
- ASYNC 表示无论事件发布的线程是哪一个,事件处理函数始终会新建一个子线程运行,同样不能进行UI操作
EventBus的优点:
基于观察者的模式设计的库,能够实现对事件的分发处理,也解耦了代码
EventBus的缺点:
- 操作麻烦,每一个事件,都要定义一个类;
- 增加方法数;
- 导致事件发送者和接收者都依赖耦合事件类;
- 如果忘记做注销操作,就会造成内存泄漏
Post和postSticky的原理:
通过post或者postSticky发布事件,如果postSticky则会把事件放到stickyEvents里面,后面注册的对象如果有sticky方法会从这里拿。
- 事件会被放到对应线程的PostingThreadState里面的eventQueue里面,如果PostingThreadState之前没在消费事件,则调用PostingThreadState开始消费事件。
- 如果设置支持事件父类也能监听到这个事件,则找到所有的事件列表
- 逐一发送事件,根据事件类型从subscriptionsByEventType找到所有的监听者Subscription
- 根据Subscription里面的响应线程分发事件
粘性事件:当事件还没有注册的时候,此时发送普通事件是无法接收到的,需要发送粘性事件
package com.example.androidinterviewjxd.eventbus;import androidx.appcompat.app.AppCompatActivity;import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;import com.example.androidinterviewjxd.R;import org.greenrobot.eventbus.EventBus;public class EventBusFirstActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_event_bus_first);EventBus.getDefault().post(new EventOne());EventTwo eventTwo = new EventTwo();EventBus.getDefault().postSticky(eventTwo);//移除粘性事件 方法1// boolean b = EventBus.getDefault().removeStickyEvent(eventTwo);// Log.d("eventbustest","removeStickyEvent============="+b);//移除粘性事件 方法2
// EventTwo stickyEventData = EventBus.getDefault().getStickyEvent(EventTwo.class);
// if(stickyEventData != null) {
// EventBus.getDefault().removeStickyEvent(stickyEventData);
// }//移除粘性事件 方法3// EventBus.getDefault().removeAllStickyEvents();}public void enterSecond(View view){startActivity(new Intent(EventBusFirstActivity.this,EventBusSecondActivity.class));}
}
package com.example.androidinterviewjxd.eventbus;import androidx.appcompat.app.AppCompatActivity;import android.os.Bundle;
import android.util.Log;
import android.widget.Toast;import com.example.androidinterviewjxd.R;import org.greenrobot.eventbus.EventBus;
import org.greenrobot.eventbus.Subscribe;
import org.greenrobot.eventbus.ThreadMode;public class EventBusSecondActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_event_bus_second);EventBus.getDefault().register(this);}@Subscribepublic void receiveNormal(EventOne eventOne){Log.d("eventbustest","receiveNormal=============");}// UI updates must run on MainThread@Subscribe(sticky = true, threadMode = ThreadMode.MAIN)public void receiveSticky(EventTwo eventData) {Log.d("eventbustest","receiveSticky=============");}@Overrideprotected void onDestroy() {super.onDestroy();EventBus.getDefault().unregister(this);}
}
EventBus总结相关推荐
- EventBus的粘性事件原理
EventBus也称事件总线,根据发送事件的类型分为普通事件和粘性事件. 粘性事件的用法: 1.订阅的时候加上sticky = true @Subscribe(threadMode = ThreadM ...
- Caused by: org.greenrobot.eventbus.EventBusException: Subscriber class com.baidu.iov.dueros.film.ui
这个错误是EventBus 包的错误 指向了EventBus.getDefault().register(this); 处理这个错误到EventBus 接受的地方 1 看看接受值是否写了 2 @Su ...
- EventBus的使用(一看就懂)
今天使用EventBus 遇到一个小bug ,这里记录下其使用 先啰嗦一下,这边博客是说怎样使用的,没有涉及到什么原理,在看之前,你或许百度了很多博客 都是MainActivity 接受消息,Seco ...
- Android中的eventBus传值
第一步:在build.gradle中添加依赖dependencies { compile 'org.greenrobot:eventbus:3.0.0'} 第二步:创建一个 Event类: 注意:en ...
- EventBus设计之禅
前言 笔者看过一些知名开源项目的源码,认为 EventBus 算是其中最简单的,甚至复杂程度不在一个级别上.解析源码前先提一下以下几个变量和类,掌握了这些变量和类基本上 EventBus 已经就掌握一 ...
- 【转】EventBus 3.0使用详解
原文:https://www.jianshu.com/p/f9ae5691e1bb 01 前言 当我们进行项目开发的时候,往往是需要应用程序的各组件.组件与后台线程间进行通信,比如在子线程中进行请求数 ...
- Android框架之路——EventBus的使用
一.简介 EventBus是由greenrobot 组织贡献的一个Android事件发布/订阅轻量级框架.EventBus是一个Android端优化的publish/subscribe消息总线,简化了 ...
- EventBus源码解析
前面一篇文章讲解了EventBus的使用,但是作为开发人员,不能只停留在仅仅会用的层面上,我们还需要弄清楚它的内部实现原理.所以本篇博文将分析EventBus的源码,看看究竟它是如何实现"发 ...
- Android 源码分析之 EventBus 的源码解析
1.EventBus 的使用 1.1 EventBus 简介 EventBus 是一款用于 Android 的事件发布-订阅总线,由 GreenRobot 开发,Gihub 地址是:EventBus. ...
- EventBus简单分析
2019独角兽企业重金招聘Python工程师标准>>> 当Android项目越来越庞大的时候,应用的各个部件之间的通信变得越来越复杂,例如:当某一条件发生时,应用中有几个部件对这个消 ...
最新文章
- GPT-4参数将达10兆!此表格预测全新语言模型参数将是GPT-3的57倍
- JavaScript Object对象
- php程序员应该懂的几个基本概念
- java跨库调用存储_存储库仅在第二个调用数据时发送回ViewModel
- 好看的a标签按钮样式
- jinja Evnironment
- 微信小程序-制作购物车
- ios视频播放器封装(全屏播放,锁屏、手势调节亮度、音量、进度)
- ioccc代码分析(1)
- 手把手教你:安装svn出现could not write value to key的错误
- windows7 C盘清理(图解)
- python随机漫步_【Python】随机漫步
- windbg挂代理下载pdb
- js逆向 空气质量检测平台
- centos php 绑定域名,彪马携手西甲联盟正式发布两款新赛季官方比赛用球
- 卸载编译安装的mysql
- BurpSuite爆破(Intruder)模块四种模式介绍
- 循环中continue用法
- “专业网络犯罪分子”对英国电信供应商进行 DDoS 攻击
- 宏文件下载_SolidWorks模型英文特征改中文名字方法分享SolidWorks宏文件 [