EventBus使用详细讲解,结合示例
- 前言
EventBus是一款针对Android优化的发布/订阅事件总线。主要功能是替代Intent,Handler,BroadCast在Fragment,Activity,Service,线程之间传递消息.优点是开销小,代码更优雅。以及将发送者和接收者解耦。
2.使用步骤
(1)在要接收消息的页面注册,比如activity的onCreate()方法里面加入下面方法:
EventBus.getDefault().register(this);
(2)退出接收页面的时候解绑,比如在activity的onDestory()方法里面加入下面方法:
EventBus.getDefault().unregister(this);
(3)发送消息,post方法里面是一个object,可以传任何对象,我这边用的是枚举,你当然也可以用自定义对象,字符串,都可以。
EventBus.getDefault().post(Event.IMAGE_LOADER_SUCCESS);
public enum Event {/*** 图片成功*/IMAGE_LOADER_SUCCESS,}
4)在接受消息的页面实现此方法(共有四个函数)
@Overridepublic void onEventMainThread(Event event) {super.onEventMainThread(event);switch (event){case IMAGE_LOADER_SUCCESS:clearEditContent();break;}}
接收页面是如何接收到通知的呢?接收页面的Event的值跟EventBus.getDefault().post(Event.IMAGE_LOADER_SUCCESS);的发送的值相同,则此页面就接收到通知,如果多个页面都有同一个event,则这几个页面都可以收到通知。
3.细节讲解
(1)EventBus还有另外有个不同的函数,他们分别是:
1、onEvent
2、onEventMainThread
3、onEventBackgroundThread
4、onEventAsync
onEvent:如果使用onEvent作为订阅函数,那么该事件在哪个线程发布出来的,onEvent就会在这个线程中运行,也就是说发布事件和接收事件线程在同一个线程。
onEventMainThread:如果使用onEventMainThread作为订阅函数,那么不论事件是在哪个线程中发布出来的,onEventMainThread都会在UI线程中执行,接收事件就会在UI线程中运行,这个在Android中是非常有用的,因为在Android中只能在UI线程中跟新UI,所以在onEvnetMainThread方法中是不能执行耗时操作的。
onEventBackground:如果使用onEventBackgrond作为订阅函数,那么如果事件是在UI线程中发布出来的,那么onEventBackground就会在子线程中运行,如果事件本来就是子线程中发布出来的,那么onEventBackground函数直接在该子线程中执行。
onEventAsync:使用这个函数作为订阅函数,那么无论事件在哪个线程发布,都会创建新的子线程在执行onEventAsync.
4.项目实战:
界面如下所示:
---->------->
然后在第三个界面,点击【发送通知】按钮,通知前两个界面。
基础类代码如下:
package com.test.eventbus;import android.app.Activity;
import android.os.Bundle;import de.greenrobot.event.EventBus;/*** <功能详细描述>** @author caoyinfei* @version [版本号, 2016/6/15]* @see [相关类/方法]* @since [产品/模块版本]*/
public class BaseActivity extends Activity {@Overrideprotected void onCreate(Bundle savedInstanceState) {EventBus.getDefault().register(this);super.onCreate(savedInstanceState);}@Overrideprotected void onDestroy() {EventBus.getDefault().unregister(this);super.onDestroy();}public void onEventMainThread(Event event) {}
}
三个页面代码如下所示:
package com.test.eventbus;import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;public class MainActivity extends BaseActivity {private Button next;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);next = (Button) findViewById(R.id.next);next.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {Intent intent = new Intent(MainActivity.this,SecondActivity.class);startActivity(intent);}});}@Overridepublic void onEventMainThread(Event event) {super.onEventMainThread(event);switch (event){case IMAGE_LOADER_SUCCESS:Log.i("cyf","MainActivity");break;}}
}
package com.test.eventbus;import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;public class SecondActivity extends BaseActivity {private Button next;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_second);next = (Button) findViewById(R.id.next);next.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {Intent intent = new Intent(SecondActivity.this, ThirdActivity.class);startActivity(intent);}});}@Overridepublic void onEventMainThread(Event event) {super.onEventMainThread(event);switch (event){case IMAGE_LOADER_SUCCESS:Log.i("cyf", "SecondActivity");break;}}
}
package com.test.eventbus;import android.os.Bundle;
import android.view.View;
import android.widget.Button;import de.greenrobot.event.EventBus;public class ThirdActivity extends BaseActivity {private Button send;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_third);send = (Button) findViewById(R.id.send);send.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {EventBus.getDefault().post(Event.IMAGE_LOADER_SUCCESS);}});}
}
运行结果如下所示:
06-15 13:51:15.891 15665-15665/com.test.eventbus I/cyf: MainActivity
06-15 13:51:15.891 15665-15665/com.test.eventbus I/cyf: SecondActivity
接收页面的Event的值跟EventBus.getDefault().post(Event.IMAGE_LOADER_SUCCESS);的发送的值相同,则此页面就接收到通知,如果多个页面都有同一个event,则这几个页面都可以收到通知。------------验证了确实是这样的。
项目地址:http://download.csdn.net/detail/dfskhgalshgkajghljgh/9550157
如有错误欢迎指出来,一起学习。
EventBus使用详细讲解,结合示例相关推荐
- SpringBoot教程(6) @Conditional 详细讲解和示例
@Conditional 详细讲解和示例 一.@Conditional简介 二.示例:加载2个Bean 1. 定义Person类 2. 利用@Configuration + @Bean加载2个Bean ...
- Spring @Conditional注解 详细讲解及示例
前言: @Conditional是Spring4新提供的注解,它的作用是按照一定的条件进行判断,满足条件给容器注册bean. @Conditional的定义: //此注解可以标注在类和方法上 @Tar ...
- 【OS系列-2】- 进程详细讲解(代码示例)
进程 进程详细讲解(代码示例) 进程 示例代码 创建进程的具体过程? 执行 fork()的时候系统做了什么? 进程间通信 管道 消息队列 共享内存 信号量 套接字 进程间同步 信号量 文件锁 无锁 C ...
- uni-app - 最详细 H5 网页接入微信登录功能,提供公众号配置与详细注释示例代码(移动端网页实现点击登录按钮后 调用微信公众号授权登录功能 详细讲解接入流程与详细示例代码)官方最新超级详细教程
前言 关于 uni-app 项目中接入微信授权登录的文章鱼龙混杂,各种乱代码.过时.没注释.不讲流程原理,非常难用. 本文实现了 uni-app H5 移动端网页项目,实现微信授权登录功能,详细讲解接 ...
- bat脚本常用命令及亲测示例代码超详细讲解
这篇文章主要介绍了bat脚本常用命令及亲测示例代码超详细讲解,在这里需要注意编辑bat文件请使用ANSI编码,不然容易出现中文乱码,需要的朋友可以参考下 目录一 1.语句注释 2.暂停 3.输出和换行 ...
- 30 道 Vue 面试题,内含详细讲解!
1.说说你对 SPA 单页面的理解,它的优缺点分别是什么? SPA( single-page application )仅在 Web 页面初始化时加载相应的 HTML.JavaScript 和 CSS ...
- Vue 注意事项,内含详细讲解
前言 转自[https://mp.weixin.qq.com/s?__biz=MjM5MDA2MTI1MA==&mid=2649091937&idx=1&sn=1d08ebe7 ...
- java异常详细讲解_Java异常处理机制的详细讲解和使用技巧
一起学习 1. 异常机制 1.1 异常机制是指当程序出现错误后,程序如何处理.具体来说,异常机制提供了程序退出的安全通道.当出现错误后,程序执行的流程发生改变,程序的控制权转移到异常处理器. 1.2 ...
- python爬虫原理-python爬虫原理详细讲解
原标题:python爬虫原理详细讲解 一 .爬虫是什么 1.什么是互联网? 互联网是由网络设备(网线,路由器,交换机,防火墙等等)和一台台计算机连接而成,像一张网一样. 2.互联网建立的目的?互联网的 ...
最新文章
- php 偷偷转移别人权重,判断百度蜘蛛偷偷进行301转移权重 给新站提权
- 迄今最详细宇宙模型建成
- 对于来自范兵提供光电检测带模块解析
- 记一次前端问题解决历程(Cannot read Property ‘call‘ of undefined)
- 拉勾网《32个Java面试必考点》学习笔记之一------Java职业发展路径
- activiti监听器使用
- 与计算机相关的课外活动,课外活动学生论文,关于应用型院校计算机专业课外活动相关参考文献资料-免费论文范文...
- LintCode MySQL 1932/1933. 挂科最多的同学 I / II
- 在ODBC中应用DDX和RFX
- 如何使用vSphere Client 将文件上传到EXSI服务器的方法步骤
- react+redux+antd图书管理系统学习
- vim移动一行或一段代码
- mpc 安全多方计算协议_HashKey:说透安全多方计算 MPC 技术方案、挑战与未来
- eclipse中出现代码覆盖的颜色信息,如何去掉
- 浅论bitset与位图算法bitmap
- C++通过生日判断星座
- 圆圈头像制作css,通过CSS3实现圆形头像显示
- windows10 cortana 不能搜索解决办法
- 复合函数的间断点问题总结
- 关于RabbitMQ连接不上None of the specified endpoints were reachable的几个原因
热门文章
- 硬盘安装到计算机里面读不出来的,新买的硬盘怎么使用?安装到电脑上系统里不显示怎么办?...
- 影视剪辑,学影视后期制作专业方面分享,基本常识补习
- 转载:基于Xlinx的时序分析、约束和收敛(3)— 基础概念(下)
- 鼠标的移入、移出事件与css中的hover伪类
- 网络综合环境搭建--思科搭建公司网络简图
- 健康小贴士(肚子疼)
- 【第006篇】通过impdp命令导入dmp文件到Oracle11g数据库中
- 【 js基础 Day4】面向过程,面向对象,自定义对象,内置对象
- AcrelEMS-HIW高速公路电力监控系统解决方案
- 绝地求生测试服画面优化软件,绝地求生大逃杀画面优化设置攻略 绝地求生大逃杀画面怎么设置...