美文网首页
EventBus详解

EventBus详解

作者: kjy_112233 | 来源:发表于2018-09-19 19:26 被阅读0次

    一、EventBus使用

    (1)EventBus作用

    • EventBus是一个Android事件发布/订阅轻量级框架。
    • 通过解耦发布者和订阅者简化Android事件传递
    • EventBus可以代替Android中Intent、Handler、Broadcast或接口函数,在Fragment、Activity、Service线程之间传递数据,执行方法。
    • 当和UI交互的时候,无论这个事件是怎么提交的,EventBus都可以在主线程传递事件。

    (2)EventBus三要素

    • Event事件:它可以是任意类型。
    • Subscriber:事件订阅者。在3.0之后事件处理的方法名可以随意取,不过需要加上注解@subscribe(),并且指定线程模型,默认是POSTING。
    • Publisher:事件发布者。我们可以在任意线程里发布事件,一般情况下,使用EventBus.getDefault()就可以得到一个EventBus对象,然后再调用post(Object)方法即可。

    (3)EventBus线程模型

    • POSTING:(默认) 表示事件处理函数的线程跟发布事件的线程在同一个线程。
    • MAIN:表示事件处理函数的线程在主线程(UI)线程,因此在这里不能进行耗时操作。
    • BACKGROUND:表示事件处理函数的线程在后台线程,因此不能进行UI操作。如果发布事件的线程是主线程(UI线程),那么事件处理函数将会开启一个后台线程,如果果发布事件的线程是在后台线程,那么事件处理函数就使用该线程。
    • ASYNC:表示无论事件发布的线程是哪一个,事件处理函数始终会新建一个子线程运行,同样不能进行UI操作。

    (4)EventBus的基本用法

    • 在build.gradle的dependencies中添加如下代码
    compile 'org.greenrobot:eventbus:3.1.1'
    
    • 注册事件
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 
      setContentView(R.layout.activity_main);
      //注册事件
      EventBus.getDefault().register(this);
    }
    
    • 解除注册
    @Override
    protected void onDestroy() {
        super.onDestroy();
        if(EventBus.getDefault().isRegistered(this)) {
            //解除注册
            EventBus.getDefault().unregister(this);
        }
    }
    
    • 发送事件
    EventBus.getDefault().post(message);
    
    • 处理事件
    • 处理消息的方法名字可以随便取。但是需要加一个注解@Subscribe,并且要指定线程模型。
    @Subscribe(threadMode = ThreadMode.MAIN)
    public void setMessage(String message) {
        //接收message
    }
    
    • 发送粘性事件
    • 发送事件之后再订阅该事件也能收到该事件,EventBus将一直缓存该粘性事件。
    EventBus.getDefault().postSticky(message);
    
    • 移除粘性事件
    removeStickyEvent();
    removeAllStickyEvents();
    
    • 处理粘性事件
    @Subscribe(threadMode = ThreadMode.MAIN,sticky = true)
    public void setMessage(String message) {
        //接收message
    }
    
    • 代码混淆
    -keepattributes *Annotation*
    -keepclassmembers class * {
        @org.greenrobot.eventbus.Subscribe <methods>;
    }
    -keep enum org.greenrobot.eventbus.ThreadMode { *; }
     
    # And if you use AsyncExecutor:
    -keepclassmembers class * extends org.greenrobot.eventbus.util.ThrowableFailureEvent {
        <init>(java.lang.Throwable);
    

    (5)订阅者索引SubscriberIndex使用

    • 在gradle文件做以下配置
    android {
        defaultConfig {
            javaCompileOptions {
                annotationProcessorOptions {
                    arguments = [eventBusIndex: 'com.ee.cp.MyEventBusIndex']
                }
            }
        }
    }
    
    dependencies {
        compile 'org.greenrobot:eventbus:3.1.1'
        annotationProcessor 'org.greenrobot:eventbus-annotation-processor:3.1.1'
    }
    
    • 在MyApplication类中配置
    EventBus.builder().addIndex(new MyEventBusIndex()).installDefaultEventBus();
    

    EventBus源码解析

    相关文章

      网友评论

          本文标题:EventBus详解

          本文链接:https://www.haomeiwen.com/subject/uwomnftx.html