30分钟学会EventBus3.0详解(二)(EventBus3.0的详细使用)(by星空武哥)
来源:互联网 发布:openstack 创建网络 编辑:程序博客网 时间:2024/05/16 11:34
转载声明原创地址:http://blog.csdn.net/lsyz0021/article/details/52094855
30分钟学会EventBus3.0详解(一)(引入和初始化EventBus3.0)
30分钟学会EventBus3.0详解(二)(EventBus3.0的详细使用)
写完上篇文章,这篇这心不想写了,但是每周至少一篇的习惯不能改啊!虽然EventBus使用起来很简单,但是种类特别多,比如他有粘性事件和非粘性事件,他们又都含有四种模式,并且还要测试在ui线程和非ui线程,所以情况很多种,废话不多说继续看。
1、EventBus工具类,这里为了使用方便写了一个简单的工具类,下面的文章就直接使用这个工具类了。
/** * 作者: lcw on 2016/7/7. * 博客: http://blog.csdn.net/lsyz0021/ */public class EventBusUtils { private static final String TAG = "EventBusUtils"; private EventBusUtils() { } /** * 注册EventBus * * @param subscriber 订阅者对象 */ public static void register(Object subscriber) { if (!EventBus.getDefault().isRegistered(subscriber)) { Log.e(TAG, "register: 注册成功"); EventBus.getDefault().register(subscriber); } else { Log.e(TAG, "register: 注册失败"); } } /** * 取消注册EventBus * * @param subscriber 订阅者对象 */ public static void unregister(Object subscriber) { EventBus.getDefault().unregister(subscriber); } /** * 发布订阅事件 * * @param event 事件对象 */ public static void post(Object event) { EventBus.getDefault().post(event); } /** * 发布粘性订阅事件 * * @param event 事件对象 */ public static void postSticky(Object event) { EventBus.getDefault().postSticky(event); } /** * 移除指定的粘性订阅事件 * * @param eventType class的字节码,例如:String.class */ public static <T> void removeStickyEvent(Class<T> eventType) { T stickyEvent = EventBus.getDefault().getStickyEvent(eventType); if (stickyEvent != null) { EventBus.getDefault().removeStickyEvent((T) stickyEvent); } } /** * 移除所有的粘性订阅事件 */ public static void removeAllStickyEvents() { EventBus.getDefault().removeAllStickyEvents(); } /** * 取消事件传送 * * @param event 事件对象 */ public static void cancelEventDelivery(Object event) { EventBus.getDefault().cancelEventDelivery(event); }}
2、创建订阅事件
public class MessageEvent {public final String message;public MessageEvent(String message) {this.message = message;}}
3、创建订阅者模式和类型
3.1、订阅者模式分为四类:
ThreadMode.MAIN 不管从哪个线程发出的事件,MAIN模式都会在UI(主线程)线程执行ThreadMode.POSTING 事件从哪个线程发布出来的就会在该线程中运行ThreadMode.BACKGROUND 如果发送事件的线程是UI线程,则重新创建新的子线程执行,因此不能执行更新UI的操作ThreadMode.ASYNC 不管从哪个线程发出的事件,ASYNC模式都会创建一个新的子线程来执行</span>
3.2、订阅者的类型分为粘性事件和非粘性事件
默认就是非粘性事件,如果是粘性事件,只需要在事件的注解上面加上
sticky = true
3.3、粘性事件,在注解上加上 priority = 优先级数(int值)priority = 1
3.4、下面就这几种模式分别讲解
3.4.1、首先是EventBus的注册,在activity的onStart()中注册
@Overrideprotected void onStart() {super.onStart();EventBusUtils.register(this);}
EventBus取消注册,在activity的onDestroy()中取消注册
@Overrideprotected void onDestroy() {super.onDestroy();EventBusUtils.unregister(this);}
3.4.2、发送事件
EventBusUtils.post(new MessageEvent("SecondActivity发布MessageEvent消息了"));
3.4.3、注册事件(含有优先级)
mian模式
@Subscribe(threadMode = ThreadMode.MAIN, priority = 1)public void onMessageEventMain(MyEvent.Message event) {text2.setText(event.msg);Log.v(tag, event.msg + " MAIN id = " + Thread.currentThread().getId());}
POSTING模式
@Subscribe(threadMode = ThreadMode.POSTING, priority = 2)public void onMessageEventPost(MyEvent.Message event) {if (isMainThread()) {text2.setText(event.msg);Log.v(tag, event.msg + " POSTING id = " + Thread.currentThread().getId());} else {Log.v(tag, event.msg + " POSTING id = " + Thread.currentThread().getId());}}
BACKGROUND模式
@Subscribe(threadMode = ThreadMode.BACKGROUND, priority = 3)public void onMessageEventBackground(MyEvent.Message event) {if (Looper.myLooper() == Looper.getMainLooper()) {text2.setText(event.msg);Log.v(tag, event.msg + " BACKGROUND id = " + Thread.currentThread().getId());} else {Log.v(tag, event.msg + " BACKGROUND id = " + Thread.currentThread().getId());}}ASYNC模式
@Subscribe(threadMode = ThreadMode.ASYNC, priority = 4)public void onMessageEventAsync(MyEvent.Message event) {//text2.setText(event.msg);// 不能在这里执行更新ui的操作LogUtils.v(tag, event.msg + " Async id = " + Thread.currentThread().getId());}
如果为粘性事件则:
发送粘性事件
EventBusUtils.postSticky(new MessageEvent("SecondActivity发布MessageEvent消息了"));
订阅粘性消息
@Subscribe(threadMode = ThreadMode.MAIN, sticky = true)public void MessageEvent(MessageEvent event) {tv_text1.setText(event.message);}
更详细请看demo代码:https://github.com/lsyz0021/EventBusUtils
30分钟学会EventBus3.0详解(一)(引入和初始化EventBus3.0)
30分钟学会EventBus3.0详解(二)(EventBus3.0的详细使用)
拿出微信 扫码关注下面的微信订阅号,及时获取更多推送文章
0 0
- 30分钟学会EventBus3.0详解(二)(EventBus3.0的详细使用)(by星空武哥)
- 30分钟学会EventBus3.0详解(一)(引入和初始化EventBus3.0)(by星空武哥)
- 30分钟学会EventBus3.0详解(一)(引入和初始化EventBus3.0)
- EventBus3.0 使用详解(一)
- EventBus3.0使用总结(二)EventBus的线程模式
- EventBus3.0的使用详解
- EventBus3使用实战(二)
- EventBus3.0使用详解
- EventBus3.0使用详解
- EventBus3.0使用详解
- EventBus3.0使用详解
- EventBus3.0使用详解
- EventBus3.0使用详解
- EventBus3.0使用详解
- EventBus3.0使用详解
- EventBus3.0使用详解
- EventBus3.0的使用
- EventBus3.0的使用
- nodejs教程之环境安装及运行
- 使用jquery切换列表
- 关系模型基本属性
- 简单的SQL注入攻击
- [Android] 软键盘打开与关闭的方法
- 30分钟学会EventBus3.0详解(二)(EventBus3.0的详细使用)(by星空武哥)
- indigo中用roslaunch启动RViz观察机器人模型
- 使用python实现简单全连接神经网络
- 初窥Linux 之 我最常用的20条命令
- JVM即时编译(JIT)
- JAVA 输出从1到100以内的质数,每5个一行。
- JVM内存基础和监控相关
- 自定义控件
- Js 日期加减