1. 前言

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使用详细讲解,结合示例相关推荐

  1. SpringBoot教程(6) @Conditional 详细讲解和示例

    @Conditional 详细讲解和示例 一.@Conditional简介 二.示例:加载2个Bean 1. 定义Person类 2. 利用@Configuration + @Bean加载2个Bean ...

  2. Spring @Conditional注解 详细讲解及示例

    前言: @Conditional是Spring4新提供的注解,它的作用是按照一定的条件进行判断,满足条件给容器注册bean. @Conditional的定义: //此注解可以标注在类和方法上 @Tar ...

  3. 【OS系列-2】- 进程详细讲解(代码示例)

    进程 进程详细讲解(代码示例) 进程 示例代码 创建进程的具体过程? 执行 fork()的时候系统做了什么? 进程间通信 管道 消息队列 共享内存 信号量 套接字 进程间同步 信号量 文件锁 无锁 C ...

  4. uni-app - 最详细 H5 网页接入微信登录功能,提供公众号配置与详细注释示例代码(移动端网页实现点击登录按钮后 调用微信公众号授权登录功能 详细讲解接入流程与详细示例代码)官方最新超级详细教程

    前言 关于 uni-app 项目中接入微信授权登录的文章鱼龙混杂,各种乱代码.过时.没注释.不讲流程原理,非常难用. 本文实现了 uni-app H5 移动端网页项目,实现微信授权登录功能,详细讲解接 ...

  5. bat脚本常用命令及亲测示例代码超详细讲解

    这篇文章主要介绍了bat脚本常用命令及亲测示例代码超详细讲解,在这里需要注意编辑bat文件请使用ANSI编码,不然容易出现中文乱码,需要的朋友可以参考下 目录一 1.语句注释 2.暂停 3.输出和换行 ...

  6. 30 道 Vue 面试题,内含详细讲解!

    1.说说你对 SPA 单页面的理解,它的优缺点分别是什么? SPA( single-page application )仅在 Web 页面初始化时加载相应的 HTML.JavaScript 和 CSS ...

  7. Vue 注意事项,内含详细讲解

    前言 转自[https://mp.weixin.qq.com/s?__biz=MjM5MDA2MTI1MA==&mid=2649091937&idx=1&sn=1d08ebe7 ...

  8. java异常详细讲解_Java异常处理机制的详细讲解和使用技巧

    一起学习 1. 异常机制 1.1 异常机制是指当程序出现错误后,程序如何处理.具体来说,异常机制提供了程序退出的安全通道.当出现错误后,程序执行的流程发生改变,程序的控制权转移到异常处理器. 1.2 ...

  9. python爬虫原理-python爬虫原理详细讲解

    原标题:python爬虫原理详细讲解 一 .爬虫是什么 1.什么是互联网? 互联网是由网络设备(网线,路由器,交换机,防火墙等等)和一台台计算机连接而成,像一张网一样. 2.互联网建立的目的?互联网的 ...

最新文章

  1. php 偷偷转移别人权重,判断百度蜘蛛偷偷进行301转移权重 给新站提权
  2. 迄今最详细宇宙模型建成
  3. 对于来自范兵提供光电检测带模块解析
  4. 记一次前端问题解决历程(Cannot read Property ‘call‘ of undefined)
  5. 拉勾网《32个Java面试必考点》学习笔记之一------Java职业发展路径
  6. activiti监听器使用
  7. 与计算机相关的课外活动,课外活动学生论文,关于应用型院校计算机专业课外活动相关参考文献资料-免费论文范文...
  8. LintCode MySQL 1932/1933. 挂科最多的同学 I / II
  9. 在ODBC中应用DDX和RFX
  10. 如何使用vSphere Client 将文件上传到EXSI服务器的方法步骤
  11. react+redux+antd图书管理系统学习
  12. vim移动一行或一段代码
  13. mpc 安全多方计算协议_HashKey:说透安全多方计算 MPC 技术方案、挑战与未来
  14. eclipse中出现代码覆盖的颜色信息,如何去掉
  15. 浅论bitset与位图算法bitmap
  16. C++通过生日判断星座
  17. 圆圈头像制作css,通过CSS3实现圆形头像显示
  18. windows10 cortana 不能搜索解决办法
  19. 复合函数的间断点问题总结
  20. 关于RabbitMQ连接不上None of the specified endpoints were reachable的几个原因

热门文章

  1. 硬盘安装到计算机里面读不出来的,新买的硬盘怎么使用?安装到电脑上系统里不显示怎么办?...
  2. 影视剪辑,学影视后期制作专业方面分享,基本常识补习
  3. 转载:基于Xlinx的时序分析、约束和收敛(3)— 基础概念(下)
  4. 鼠标的移入、移出事件与css中的hover伪类
  5. 网络综合环境搭建--思科搭建公司网络简图
  6. 健康小贴士(肚子疼)
  7. 【第006篇】通过impdp命令导入dmp文件到Oracle11g数据库中
  8. 【 js基础 Day4】面向过程,面向对象,自定义对象,内置对象
  9. AcrelEMS-HIW高速公路电力监控系统解决方案
  10. 绝地求生测试服画面优化软件,绝地求生大逃杀画面优化设置攻略 绝地求生大逃杀画面怎么设置...