【Android 进阶】EventBus---超级方便的工具
来源:互联网 发布:安卓手机应用 知乎 编辑:程序博客网 时间:2024/05/21 11:05
EventBus是什么?有什么用处?
EventBus是一款针对Android优化的发布/订阅(publish/subscribe)事件总线。主要功能是替代Intent,Handler,BroadCast在Fragment,Activity,Service,线程之间传递消息。简化了应用程序内各组件间、组件与后台线程间的通信。优点是开销小,代码更优雅。以及将发送者和接收者解耦。比如请求网络,等网络返回时通过Handler或Broadcast通知UI,两个Fragment之间需要通过Listener通信,这些需求都可以通过EventBus实现。
开源地址
https://github.com/greenrobot/EventBus
一般使用步骤
1)添加jar包到libs文件夹下
2)注册(在需要接受到数据的Activity)
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
EventBus.getDefault().register(this);
}
3)解注册(在需要接受到数据的Activity)
@Override
protected void onDestroy() {
super.onDestroy();
EventBus.getDefault().unregister(this);
}
4)构造 发送消息 类(另外建立一个class)
public class MessageEvent {
public String name;
public String password;
public MessageEvent(String name, String password) {
this.name = name;
this.password = password;
}
}
5)发布消息(不需要在该调用所在的Activity里注册和解注册)
EventBus.getDefault().post(new MessageEvent(“veyron”,”123”));
6)接收信息类(当然是在你注册和解注册的那个Activity里面)
@Subscribe(threadMode = ThreadMode.MAIN)
public void messageEventBus(MessageEvent event){
tv_result.setText(“name:”+event.name+” passwrod:”+event.password);
}
其中:
接收方法类型:
ThreadMode.MAIN 表示这个方法在主线程中执行,就是事件的处理会在UI线程中执行。事件处理时间不能太长,这个不用说的,长了会ANR的。ThreadMode.BACKGROUND :事件处理是在后台线程,但事件处理时间还是不应该太长,因为如果发送事件的线程是后台线程,会直接执行事件,如果当前线程是UI线程,事件会被加到一个队列中,由一个线程依次处理这些事件,如果某个事件处理时间太长,会阻塞后面的事件的派发或处理。不能并发处理。
ThreadMode.ASYNC :事件处理会在单独的线程中执行,主要用于在后台线程中执行耗时操作,每个事件会开启一个线程(有线程池),但最好限制线程的数目。异步并发处理。
ThreadMode.POSTING: 事件的处理和事件的发送在相同的进程,所以事件处理时间不应太长,不然影响事件的发送线程,而这个线程可能是UI线程。
注意:
假设ActivityA想通过EventBus向ActivityB发送数据。准备好发送消息类,在ActivityB里面分别注册和解注册,然后准备接收消息类。这时候从
ActivityA点击按钮开启ActivityB,发现接收消息类是接收不到数据的。
原因就是一般事件必须先注册,再发送数据。也就是说ActivityB必须先开启,所以问题就是:通过ActivityA 开启ActivityB(本身没有先开启,所以接收不到数据)。
这并不是我们想要的结果对吧?那么看下面的黏性事件。
黏性事件以及使用步骤
之前说的使用方法, 都是需要先注册(register), 再post,才能接受到事件;
如果你使用postSticky发送事件, 那么可以不需要先注册, 也能发送信息,但是最后还是需要注册了才可以接收到数据。这种方式也是符合我们大众的需求以及思维习惯。
1)构造 发送信息 类
public class StickyEvent {
public String msg;
public StickyEvent(String msg) {
this.msg = msg;
}
}
2)发布黏性消息类
EventBus.getDefault().postSticky(new StickyEvent(“这个是粘性事件”));
3)接收消息类
//注意,和之前的方法一样,只是多了一个 sticky = true 的属性.
@Subscribe(threadMode = ThreadMode.MAIN, sticky = true)
public void onEvent(StickyEvent event){
tv_c_result.setText(event.msg);
}
4)注册:才真正接收信息,或者说开启接收权限,接收信息代码才会执行。
EventBus.getDefault().register(Activity.this);
5)解注册
EventBus.getDefault().removeAllStickyEvents();
EventBus.getDefault().unregister(Activity.class);
索引加速:
3.0 后引入了索引加速(默认不开启)的功能,即通过 apt 编译插件的方式,在代码编译的时候对注解进行索引,避免了以往通过反射造成的性能损耗。
如何使用可以参考官方文档
Proguard处理:
#EventBus -keepclassmembers class ** { public void onEvent*(**); void onEvent*(**); }
- 【Android 进阶】EventBus---超级方便的工具
- android 超级简单方便的注解注入控件和方法
- 基于JXL的java excel操作,Android适用,超级方便!
- 超级方便的中英文翻译
- EventBus进阶
- android进阶路--EventBus使用详解
- 表单检验的超级方便的方法
- 超级方便的Ajax控件-MagicAjax
- 超级方便的boost安装方法
- 超级瑞士军刀:方便实用的日常生活工具箱
- 超级方便的linux命令手册
- Android 分享一个SharedPreferences的工具类,方便保存数据
- Android 开发 方便的工具及类接口
- Android 分享一个SharedPreferences的工具类,方便保存数据
- Android 分享一个SharedPreferences的工具类,方便保存数据
- Android 分享一个SharedPreferences的工具类,方便保存数据
- Android底部/顶部滑动菜单,方便调用的工具类
- Android 分享一个SharedPreferences的工具类,方便保存数据
- centos7 电脑网络配置
- 程序猿小白的2016—不忘初心,继续奋斗
- UML总结
- redis3.0.7源码阅读(十二)redis事件处理
- CentOS64位6.5下部署Zabbix2.2.6监控系统
- 【Android 进阶】EventBus---超级方便的工具
- 认识多线程
- 原生js实现的下拉多选控件,引用只需一个js
- Leetcode——209. Minimum Size Subarray Sum
- python基础语法(4) 字典
- 【个人网站搭建】QQ授权登录
- RecyclerView不调用onCreateViewHolder和onBindViewHolder的解决方法
- 树,森林与二叉树的转换 数据结构期末复习
- Volley的简单应用