【开源库推荐】#3 Android EventBus的使用
原文地址:【开源库推荐】#3 Android EventBus的使用 | Stars-One的杂货小窝
Event bus for Android and Java that simplifies communication between Activities, Fragments, Threads, Services, etc. Less code, better quality
Android和Java的事件总线,简化了活动,片段,线程,服务等之间的通信。代码越少,质量越好
EventBus是一款事件分发框架,可以跨进程,跨Activity/Fragment进行通信,今天来简单的来入下门
介绍
EventBus可以做什么?
这里来个例子比较好说明,我们知道Android中有个广播机制,可以让Activity和Service互相通信,但是写法过于麻烦,且不够灵活;
又比如,一个Activity中含有几个Fragment,其中的Fragment互相又要实现传数据通信,同时,也要与外层的Activity进行数据的交互,按照常规套路,我们使用传参,写法十分复杂
这个时候,我们就可以使用EventBus,就可以十分快速且简单地实现我们需要实现的效果
本质上,EventBus也是使用了观察者模式来实现其的功能
基本使用
1.绑定Activity
首先,导入依赖
implementation 'org.greenrobot:eventbus:3.0.0'
- 需要在Activity中的
onCreate()方法中,与当前Activity绑定 - 在Activity的
onDestroy()方法中,进行解绑,否则会造成内存泄漏问题
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_event_bus)
//绑定
EventBus.getDefault().register(this)
}
override fun onDestroy() {
super.onDestroy()
//取消绑定
EventBus.getDefault().unregister(this)
}
Activity的界面比较简单,就是一个TextView和FrameLayout,之后创建一个Fragment放入FrameLayout中
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".EventBusActivity">
<TextView
android:id="@+id/tvContent"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:textSize="20sp"
android:text="Hello world" />
<FrameLayout
android:id="@+id/framelayout"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
</LinearLayout>
2.声明入口方法
在当前的绑定的Activity中声明一个public的方法,返回值为void,同时,使用EventBus的注解@Subscribe对方法进行标识
注:此注解是
3.0.0版本以后才加的,且方法一定是要公共的,否则EventBus会报错,原因也是很简单,估计EventBus是通过注解去找到方法,之后利用Java的反射特性进行回调
@Subscribe(threadMode = ThreadMode.MAIN)
public fun changeText(str:String){
tvContent.text = str
}
threadMode有四种模式:
POSTING(默认):如果使用事件处理函数指定了线程模型为POSTING,那么该事件在哪个线程发布出来的,事件处理函数就会在这个线程中运行,也就是说发布事件和接收事件在同一个线程。在线程模型为POSTING的事件处理函数中尽量避免执行耗时操作,因为它会阻塞事件的传递,甚至有可能会引起应用程序无响应(ANR)。MAIN:事件的处理会在UI线程中执行。事件处理时间不能太长,长了会ANR的。BACKGROUND:如果事件是在UI线程中发布出来的,那么该事件处理函数就会在新的线程中运行,如果事件本来就是子线程中发布出来的,那么该事件处理函数直接在发布事件的线程中执行。在此事件处理函数中禁止进行UI更新操作。ASYNC:无论事件在哪个线程发布,该事件处理函数都会在新建的子线程中执行,同样,此事件处理函数中禁止进行UI更新操作。
这里我们选用Main.且为了简单起见,方法定义一个String类型,之后把activity中的文本修改为传过来的数据
这个方法其实就是事件的接收者,之后在其他地方(如Fragment,Service或其他Activity)发出事件,EventBus会根据参数类型寻找对应的入口,同时将数据传到当前的入口,我将其称为入口方法
方法类型可以随意定义,一般是某个事件定义个类用来存储传过来的数据,规范一点的话,可以统一下事件类中的格式,使用枚举来区分不同事件(当然,这种就比较适合那种只有一个入口)
3.post()方法发事件
之后我们在其他调用post方法发出事件即可,这里给大家演示下载Fragment中的按钮发出事件


btnChangeText.setOnClickListener {
EventBus.getDefault().post("修改过后的文字")
}
之后即可实现点击按钮实现改变文字的效果,如下图

补充-postSticky()方法
上述中,使用的post()方法,但是可以看到代码提示中还存在一个postSticky()方法,这个方法是由什么区别呢?
postSticky()是对应的粘性事件,我们可以看到Subscribe注解中存在一个sticky属性,其默认是false

看到这就可以猜测到了,这两者是配合使用的
那么什么是粘性事件呢?
比如说你发出了一个事件,但是由于对应的事件消费的Activity或Fragment对象还没有被创建,于是你发出的事件就会被丢弃了
为了避免这种情况,EventBus提供了粘性事件,它会把事件先存在队列中,等待Activity或Fragment启动,则会自动把事件分发过去
postSticky()的使用与post()一样,这里不再赘述
插件推荐
由于使用了EventBus,排查代码的时候非常不好排查,这里推荐大家一款Android Studio的插件,可以快速跳转到对应的入口方法或是发出方法的代码
名字为EventBus3-IDEA

安装之后,你就可以看见旁边会有个小图标,点击之后会跳转到对应的代码

不过测试的时候感觉对Kotlin语言还没适配,点击没法跳转,等作者等后续适配...
参考
【开源库推荐】#3 Android EventBus的使用的更多相关文章
- 27个提升效率的iOS开源库推荐
DZNEmptyDataSet(UI,空表格视图解算器) PDTSimpleCalendar(UI,drop-in日历组件) MagicalRecord(实施活跃记录模式的Core Data助手) C ...
- 开源巨献:年度最佳 JavaScript 和 CSS 开源库推荐!
作者:编辑部的故事 < 开源巨献:年度最佳 JavaScript 和 CSS 开源库推荐! > 开源巨献:年度最佳 JavaScript 和 CSS 开源库推荐! Tutoria ...
- <Android开源库 ~ 1> GitHub Android Libraries Top 100 简介
转载自GitHub Android Libraries Top 100 简介 本项目主要对目前 GitHub 上排名前 100 的 Android 开源库进行简单的介绍, 至于排名完全是根据 GitH ...
- Java下好用的开源库推荐
作者:Jack47 转载请保留作者和原文出处 欢迎关注我的微信公众账号程序员杰克,两边的文章会同步,也可以添加我的RSS订阅源. 本文想介绍下自己在Java下做开发使用到的一些开源的优秀编程库,会不定 ...
- 快快快!27个提升效率的iOS开源库推荐
文章来源:http://www.csdn.net/article/2015-07-21/2825264-27-ios-open-source-libraries/1 我热爱开源,更喜爱那些花费宝贵的业 ...
- 快快快!27个提升效率的iOS开源库推荐(转)
CSDN移动将持续为您优选移动开发的精华内容,共同探讨移动开发的技术热点话题,涵盖移动应用.开发工具.移动游戏及引擎.智能硬件.物联网等方方面面.如果您想投稿.参与内容翻译工作,或寻求近匠报道,请发送 ...
- 各种实用的 PHP 开源库推荐【转】
转自: https://my.oschina.net/editorial-story/blog/882780 PHP 是一种通用开源脚本语言.语法吸收了 C 语言.Java 和 Perl 的特点,利于 ...
- ios开发--27个提升效率的iOS开源库推荐
超长慎入列表: DZNEmptyDataSet(UI,空表格视图解算器) PDTSimpleCalendar(UI,drop-in日历组件) MagicalRecord(实施活跃记录模式的Core D ...
- 各种Android UI开源框架 开源库
各种Android UI开源框架 开源库 转 https://blog.csdn.net/zhangdi_gdk2016/article/details/84643668 自己总结的Android开源 ...
随机推荐
- 关于Postman你必须学会的技能
关于Postman 工欲善其事,必先利其器,在了解了接口测试之后,就要选择一款适用的工具.之所以选择postman是因为它简单.容易上手.能覆盖大多数HTTP接口测试场景,性价比极高. Postman ...
- 关于Windows操作系统重定向
在用C++做一个文件遍历的时候发现,当我遍历C:\Windows\system32文件夹时,获取到的文件数目和实际总是对不上.在通过他人帮助后了解到了重定向这个概念,我百度了一下,下面为粘贴内容. S ...
- 极简SpringBoot指南-Chapter01-如何用Spring框架声明Bean
仓库地址 w4ngzhen/springboot-simple-guide: This is a project that guides SpringBoot users to get started ...
- 题解 有标号DAG计数
题目传送门 题目大意 给出\(n\),求出对于任意\(t\in[1,n]\),点数为\(t\)的弱联通\(\texttt{DAG}\)个数.答案对\(998244353\)取模. \(n\le 10^ ...
- bzoj1341 名次排序问题rank sorting(dp,考虑到对未来的贡献)
QWQ啊 这个题可以说是我目前碰到过的最难理解的dp之一了. 题目大意: 已知参赛选手的得分,你的任务是按照得分从高到底给出选手的排名.遗憾的是,保存选手信息的数据结构只支持 一种操作,即将一个选手从 ...
- 试题 算法训练 二进制数数 java解题
资源限制 时间限制:1.0s 内存限制:256.0MB 问题描述 给定L,R.统计[L,R]区间内的所有数在二进制下包含的"1"的个数之和. 如5的二进制为101,包含2个&q ...
- python T1119紧急措施
2021-10-18 题目: 近日,一些热门网站遭受黑客入侵,这些网站的账号.密码及 email 的数据惨遭泄露.你在这些网站上注册若干账号(使用的用户名不一定相同),但是注册时使用了相同的 emai ...
- 8086存储器组织和IO组织 奇偶分体
8086的存储器组织 存储器的基本存储单位是字节,每个字节用唯一的地址码表示. 若存放的信息是8位的字节数据,将按顺序存放: 若存放的信息是16位的字数据,则将字的高位字节放在高地址中,低位字节放在低 ...
- 使用YApi搭建API接口管理工具(docker安装)
使用YApi搭建API接口管理工具(docker安装) 工具描述 YApi 是高效.易用.功能强大的 api 管理平台,旨在为开发.产品.测试人员提供更优雅的接口管理服务.可以帮助开发者轻松创建.发布 ...
- Chrome 实时字幕
Chrome 实时字幕