EventBus3.0使用
2016-05-22 16:47
357 查看
EventBus简介:
EventBus是一个用于简化Andorid、Fragment、Threads、
Service之间信息传递的一个发布/订阅事件集。
简化了应用程序内各组件间、组件与后台线程间的通信。比如请求网络,等网络返回时通过Handler或Broadcast通知UI,两个Fragment之间需要通过Listener通信,这些需求都可以通过EventBus实现
使用EventBus的建议:
并不建议将应用中所有的事件都通过EventBus进行发送,尤其对于一对一的组件之间通信,建议不要使用EventBus。EventBus的使用场景更像是一种广播,当我们向EventBus发送一个事件,则该事件将会传递给多个该事件的订阅者,比如Service向Activities发送事件。跟LoacalBroadCast有点近似
在Activity和Fragment中使用EventBus时,要注意在组件的生命周期开始时registered EventBus,在生命周期结束时unregistered EventBus。否则容易导致OOM
EventBus基本用法:
1、添加依赖
compile ‘de.greenrobot:eventbus:3.0.0-beta1’
2、注册
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second);
initView();
//哪个类想要接收数据,注册接受事件
EventBus.getDefault().register(this);
}
3、在onDestroy中解除注册:
@Override
protected void onDestroy() {
super.onDestroy();
EventBus.getDefault().unregister(this);
}
4、订阅者
@Subscribe(threadMode = ThreadMode.MainThread)
public void helloEventBus(String message) {
mText.setText(message);
}
5、发布者
EventBus.getDefault().post(eventClass);
eEvent任意类型的值,需要和订阅者参数类型一致
在此对ThreadMode进行说明:
ThreadMode.MAIN:Android的UI线程中执行。
ThreadMode.POSTING:在和发送事件相同的线程中执行。默认的线程模式
前两个很容易理解
ThreadMode.BACKGROUND:交给EventBus的一条幕后线程去执行,注意EventBus中只有一个这样的幕后线程,所有的异步方法会在这条线程中顺序执行。要求事件处理方法不要耗时太长!
此时分两种情况:
一:如果分发事件在子线程运行,那么接收事件直接在同样线程运行
二: 如果分发事件在UI线程,那么会启动一个子线程运行接收事件
ThreadMode.ASYNC:无论分发事件在(UI或者子线程)哪个线程执行,接收都会在另外一个子线程执行对于。网络请求等可以使用这种模式!
EventBus postSticky()进行说明
当Activity进行跳转时,传值给跳转Activity,使用EventBus.getDefault().post(student);
发现无法将值传递过去,是因为,EventBus必须先注册,而跳转的Activity此时并没有实例化
所以如果想要给它传值,需要使用postSticky()方法
EventBus.getDefault().postSticky(100);
那在注册时,添加sticky属性就可以了
@Subscribe(threadMode = ThreadMode.MAIN, sticky = true)
public void onUserEvent(Integer index) {
Log.d(“flag”, “—————>index: ” + index);
//在此可以更新UI
showMessage.setText(“” + index);
}
EventBus是一个用于简化Andorid、Fragment、Threads、
Service之间信息传递的一个发布/订阅事件集。
简化了应用程序内各组件间、组件与后台线程间的通信。比如请求网络,等网络返回时通过Handler或Broadcast通知UI,两个Fragment之间需要通过Listener通信,这些需求都可以通过EventBus实现
使用EventBus的建议:
并不建议将应用中所有的事件都通过EventBus进行发送,尤其对于一对一的组件之间通信,建议不要使用EventBus。EventBus的使用场景更像是一种广播,当我们向EventBus发送一个事件,则该事件将会传递给多个该事件的订阅者,比如Service向Activities发送事件。跟LoacalBroadCast有点近似
在Activity和Fragment中使用EventBus时,要注意在组件的生命周期开始时registered EventBus,在生命周期结束时unregistered EventBus。否则容易导致OOM
EventBus基本用法:
1、添加依赖
compile ‘de.greenrobot:eventbus:3.0.0-beta1’
2、注册
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second);
initView();
//哪个类想要接收数据,注册接受事件
EventBus.getDefault().register(this);
}
3、在onDestroy中解除注册:
@Override
protected void onDestroy() {
super.onDestroy();
EventBus.getDefault().unregister(this);
}
4、订阅者
@Subscribe(threadMode = ThreadMode.MainThread)
public void helloEventBus(String message) {
mText.setText(message);
}
5、发布者
EventBus.getDefault().post(eventClass);
eEvent任意类型的值,需要和订阅者参数类型一致
在此对ThreadMode进行说明:
ThreadMode.MAIN:Android的UI线程中执行。
ThreadMode.POSTING:在和发送事件相同的线程中执行。默认的线程模式
前两个很容易理解
ThreadMode.BACKGROUND:交给EventBus的一条幕后线程去执行,注意EventBus中只有一个这样的幕后线程,所有的异步方法会在这条线程中顺序执行。要求事件处理方法不要耗时太长!
此时分两种情况:
一:如果分发事件在子线程运行,那么接收事件直接在同样线程运行
二: 如果分发事件在UI线程,那么会启动一个子线程运行接收事件
ThreadMode.ASYNC:无论分发事件在(UI或者子线程)哪个线程执行,接收都会在另外一个子线程执行对于。网络请求等可以使用这种模式!
EventBus postSticky()进行说明
当Activity进行跳转时,传值给跳转Activity,使用EventBus.getDefault().post(student);
发现无法将值传递过去,是因为,EventBus必须先注册,而跳转的Activity此时并没有实例化
所以如果想要给它传值,需要使用postSticky()方法
EventBus.getDefault().postSticky(100);
那在注册时,添加sticky属性就可以了
@Subscribe(threadMode = ThreadMode.MAIN, sticky = true)
public void onUserEvent(Integer index) {
Log.d(“flag”, “—————>index: ” + index);
//在此可以更新UI
showMessage.setText(“” + index);
}
相关文章推荐
- 在jQueryEasyui datagrid加载完成后清除选中
- cookie 和 session
- 【BZOJ-2115】Xor 线性基 + DFS
- Python 资源大全中文版
- POJ 1276 多重背包+模板
- C++变量和对象的区别联系
- Android进程间通信(IPC)之Socket
- Android之记住密码与自动登陆实现
- web前端新手需要认识的CSS;css共有多少标签呢?
- Cube Stacking
- 软件工程个人作业12
- linux的脚本应用for循环答应变量
- Navicat连接Oracle11g 错误的解决办法
- Action属性值决定物理视图资源
- PAT螺旋方阵
- 反转一个单链表并输出
- map 有log n 的时间复杂度 map 有log n 的时间复杂度 map 有log n 的时间复杂度 map 有log n 的时间复杂度 map 有log n 的时间复杂度 map
- 基于STM32F429-Discovery USART1 PA9 PA10 调试成功。
- WPF数据验证
- 表格:全选,删除,跳出弹窗