EventBus3.0的详细使用

写完上篇文章,这篇这心不想写了,但是每周至少一篇的习惯不能改啊!虽然EventBus使用起来很简单,但是种类特别多,比如他有粘性事件和非粘性事件,他们又都含有四种模式,并且还要测试在ui线程和非ui线程,所以情况很多种,废话不多说继续看。

1、EventBus工具类,这里为了使用方便写了一个简单的工具类,下面的文章就直接使用这个工具类了。

[java] view plain copy
  1. /** 
  2.  * 作者: lcw on 2016/7/7. 
  3.  * 博客: http://blog.csdn.net/lsyz0021/ 
  4.  */  
  5. public class EventBusUtils {  
  6.   
  7.     private static final String TAG = "EventBusUtils";  
  8.     private EventBusUtils() {  
  9.     }  
  10.   
  11.     /** 
  12.      * 注册EventBus 
  13.      * 
  14.      * @param subscriber 订阅者对象 
  15.      */  
  16.     public static void register(Object subscriber) {  
  17.         if (!EventBus.getDefault().isRegistered(subscriber)) {  
  18.             Log.e(TAG, "register: 注册成功");  
  19.             EventBus.getDefault().register(subscriber);  
  20.         } else {  
  21.             Log.e(TAG, "register: 注册失败");  
  22.         }  
  23.     }  
  24.   
  25.     /** 
  26.      * 取消注册EventBus 
  27.      * 
  28.      * @param subscriber 订阅者对象 
  29.      */  
  30.     public static void unregister(Object subscriber) {  
  31.         EventBus.getDefault().unregister(subscriber);  
  32.     }  
  33.   
  34.     /** 
  35.      * 发布订阅事件 
  36.      * 
  37.      * @param event 事件对象 
  38.      */  
  39.     public static void post(Object event) {  
  40.         EventBus.getDefault().post(event);  
  41.     }  
  42.   
  43.     /** 
  44.      * 发布粘性订阅事件 
  45.      * 
  46.      * @param event 事件对象 
  47.      */  
  48.     public static void postSticky(Object event) {  
  49.         EventBus.getDefault().postSticky(event);  
  50.     }  
  51.   
  52.     /** 
  53.      * 移除指定的粘性订阅事件 
  54.      * 
  55.      * @param eventType class的字节码,例如:String.class 
  56.      */  
  57.     public static <T> void removeStickyEvent(Class<T> eventType) {  
  58.         T stickyEvent = EventBus.getDefault().getStickyEvent(eventType);  
  59.         if (stickyEvent != null) {  
  60.             EventBus.getDefault().removeStickyEvent((T) stickyEvent);  
  61.         }  
  62.     }  
  63.   
  64.     /** 
  65.      * 移除所有的粘性订阅事件 
  66.      */  
  67.     public static void removeAllStickyEvents() {  
  68.         EventBus.getDefault().removeAllStickyEvents();  
  69.     }  
  70.   
  71.     /** 
  72.      * 取消事件传送 
  73.      * 
  74.      * @param event 事件对象 
  75.      */  
  76.     public static void cancelEventDelivery(Object event) {  
  77.         EventBus.getDefault().cancelEventDelivery(event);  
  78.     }  
  79. }  

2、创建订阅事件

[java] view plain copy
  1. public class MessageEvent {  
  2.     public final String message;  
  3.   
  4.     public MessageEvent(String message) {  
  5.         this.message = message;  
  6.     }  
  7.   
  8. }  

3、创建订阅者模式和类型

 3.1、订阅者模式分为四类:

[java] view plain copy
  1. ThreadMode.MAIN          不管从哪个线程发出的事件,MAIN模式都会在UI(主线程)线程执行  
  2. ThreadMode.POSTING       事件从哪个线程发布出来的就会在该线程中运行  
  3. ThreadMode.BACKGROUND    如果发送事件的线程是UI线程,则重新创建新的子线程执行,因此不能执行更新UI的操作  
  4. ThreadMode.ASYNC         不管从哪个线程发出的事件,ASYNC模式都会创建一个新的子线程来执行</span>  

3.2、订阅者的类型分为粘性事件和非粘性事件

 默认就是非粘性事件,如果是粘性事件,只需要在事件的注解上面加上

sticky = true

3.3、粘性事件,在注解上加上 priority = 优先级数(int值)
priority = 1

3.4、下面就这几种模式分别讲解

3.4.1、首先是EventBus的注册,在activity的onStart()中注册

[java] view plain copy
  1.        @Override  
  2. protected void onStart() {  
  3.     super.onStart();  
  4.     EventBusUtils.register(this);  
  5. }  

  EventBus取消注册,在activity的onDestroy()中取消注册

[java] view plain copy
  1.        @Override  
  2. protected void onDestroy() {  
  3.     super.onDestroy();  
  4.     EventBusUtils.unregister(this);  
  5. }  

3.4.2、发送事件

[java] view plain copy
  1. EventBusUtils.post(new MessageEvent("SecondActivity发布MessageEvent消息了"));  

3.4.3、注册事件(含有优先级)

mian模式

[java] view plain copy
  1. @Subscribe(threadMode = ThreadMode.MAIN, priority = 1)  
  2. public void onMessageEventMain(MyEvent.Message event) {  
  3.     text2.setText(event.msg);  
  4.     Log.v(tag, event.msg + " MAIN id = " + Thread.currentThread().getId());  
  5. }  

POSTING模式

[java] view plain copy
  1. @Subscribe(threadMode = ThreadMode.POSTING, priority = 2)  
  2. public void onMessageEventPost(MyEvent.Message event) {  
  3.     if (isMainThread()) {  
  4.         text2.setText(event.msg);  
  5.         Log.v(tag, event.msg + " POSTING id = " + Thread.currentThread().getId());  
  6.     } else {  
  7.         Log.v(tag, event.msg + " POSTING id = " + Thread.currentThread().getId());  
  8.     }  
  9. }  

BACKGROUND模式
[java] view plain copy
  1.        @Subscribe(threadMode = ThreadMode.BACKGROUND, priority = 3)  
  2. public void onMessageEventBackground(MyEvent.Message event) {  
  3.     if (Looper.myLooper() == Looper.getMainLooper()) {  
  4.   
  5.         text2.setText(event.msg);  
  6.         Log.v(tag, event.msg + " BACKGROUND id = " + Thread.currentThread().getId());  
  7.     } else {  
  8.   
  9.         Log.v(tag, event.msg + " BACKGROUND id = " + Thread.currentThread().getId());  
  10.     }  
  11. }  
ASYNC模式
[java] view plain copy
  1. @Subscribe(threadMode = ThreadMode.ASYNC, priority = 4)  
  2.     public void onMessageEventAsync(MyEvent.Message event) {  
  3. //      text2.setText(event.msg);   // 不能在这里执行更新ui的操作  
  4.         LogUtils.v(tag, event.msg + " Async id = " + Thread.currentThread().getId());  
  5.   
  6.     }  

如果为粘性事件则:

发送粘性事件

[java] view plain copy
  1. EventBusUtils.postSticky(new MessageEvent("SecondActivity发布MessageEvent消息了"));  

订阅粘性消息
[java] view plain copy
  1. @Subscribe(threadMode = ThreadMode.MAIN, sticky = true)  
  2. public void MessageEvent(MessageEvent event) {  
  3.     tv_text1.setText(event.message);  
  4. }  

更详细请看demo代码:https://github.com/lsyz0021/EventBusUtils

猜你喜欢

转载自blog.csdn.net/weixin_42336002/article/details/80592261