美文网首页
事件分发库-EventBus

事件分发库-EventBus

作者: 飞奔吧牛牛 | 来源:发表于2018-09-06 17:16 被阅读0次

github

准备

下载jar包

eventbus-3.1.1.jar

混淆

http://greenrobot.org/eventbus/documentation/proguard/

#EventBus
-keepattributes *Annotation*
-keepclassmembers class * {
    @org.greenrobot.eventbus.Subscribe <methods>;
}
-keep enum org.greenrobot.eventbus.ThreadMode { *; }

# Only required if you use AsyncExecutor
-keepclassmembers class * extends org.greenrobot.eventbus.util.ThrowableFailureEvent {
    <init>(java.lang.Throwable);
}
#EventBus

使用

在接收消息的Activity或fragment中注册

//activity
 @Override 
 protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        EventBus.getDefault().register(this);
    }
//fragment
 @Override 
 protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        EventBus.getDefault().register(this);
    }

 @Override
    protected void onDestroy() {
        super.onDestroy();
        EventBus.getDefault().unregister(this);
    }

在两个Button点击事件中发送消息

//在主线程中发送消息
public void onClick(View v) {
                EventBus.getDefault().post(new MyEvent("this is a event"));
            }
//在子线程中发送消息
 public void onClick(View v) {
                new Thread(new Runnable() {
                    @Override
                    public void run() {
                        EventBus.getDefault().post(new MyEvent("this is a event2"));
                    }
                }).start();
            }

接收消息,打印使用的线程模式,接收消息的线程id,接收的消息内容

 @Subscribe(threadMode = ThreadMode.POSTING)
    public void onEventPOSTING(MyEvent event) {
        Log.e(TAG, "POSTING: " + Thread.currentThread().getId() + " " + event.getMsg());
    }

    @Subscribe(threadMode = ThreadMode.MAIN)
    public void onEventMain(MyEvent event) {
        Log.e(TAG, "MAIN: " + Thread.currentThread().getId() + " " + event.getMsg());
    }

    @Subscribe(threadMode = ThreadMode.MAIN_ORDERED)
    public void onEventMAIN_ORDERED(MyEvent event) {
        Log.e(TAG, "MAIN_ORDERED: " + Thread.currentThread().getId() + " " + event.getMsg());
    }

    @Subscribe(threadMode = ThreadMode.ASYNC)
    public void onEventASYNC(MyEvent event) {
        Log.e(TAG, "ASYNC: " + Thread.currentThread().getId() + " " + event.getMsg());
    }

    @Subscribe(threadMode = ThreadMode.BACKGROUND)
    public void onEventBACKGROUND(MyEvent event) {
        Log.e(TAG, "BACKGROUND: " + Thread.currentThread().getId() + " " + event.getMsg());
    }

输出结果

在主线程中发送消息时:

test: ASYNC: 5987 this is a event
test: MAIN: 1 this is a event
test: POSTING: 1 this is a event
test: BACKGROUND: 5988 this is a event
test: MAIN_ORDERED: 1 this is a event

在子线程中发送消息时:

test: BACKGROUND: 5989 this is a event2
test: POSTING: 5989 this is a event2
test: ASYNC: 5990 this is a event2
test: MAIN_ORDERED: 1 this is a event2
test: MAIN: 1 this is a event2

总结:

接收代码所在线程和发送代码所在线程的关系

POSTING:和发送方保持一直
MAIN:不管发送方在哪里,始终在Main线程
ASYNC:不管发送方在哪里,始终开启新线程
BACKGROUND:如果发送方在主线程,BACKGROUND则会新开一个线程;如果发送方在子线程,BACKGROUND则会和发送方保持一致
MAIN_ORDERED:和MAIN一样,但事件会按先后顺序执行。

更新StickyEvent

如果Event发送过了,但是后面的Activity仍然想接收,由于后面的Activity的注册行为发生在事件发出之后,所以它是收不到事件的。解决方法就是使用postSticky。

//事件发出
EventBus.getDefault().postSticky(new MyEvent("this is a event"));

//事件接收
  @Subscribe(threadMode = ThreadMode.MAIN, sticky = true)
    public void testSicky(MyEvent event) {
        Log.e("test2", Thread.currentThread().getId() + "  " + event.getMsg());
    }

//事件移除
 public void removeEvent() {
        MyEvent stickyEvent = EventBus.getDefault().getStickyEvent(MyEvent.class);
        if (stickyEvent != null) {
            EventBus.getDefault().removeStickyEvent(stickyEvent);
        }
    }

相关文章

  • 事件分发库-EventBus

    github 准备 下载jar包 eventbus-3.1.1.jar 混淆 http://greenrobot....

  • EventBus源码解析

    知识点汇总: 一:EventBus框架概述 二:EventBus的注册实现原理 三:EventBus的事件分发实现...

  • EventBus全解析系列(三)

    EventBus 事件分发源码分析 承接上篇我们讲了EventBus的注册和反注册,本篇我们来讲解EventBus...

  • 一篇讲明白EventBus

    先说EventBus是什么: EventBus是 基于 订阅/发布 模式实现的 基于事件的异步分发处理系统。 ...

  • Flutter 99: 初识 EventBus

    小菜在 Android 开发过程中经常会用到 EventBus 事件分发机制,EventBus 遵从 publis...

  • EventBus分析

    EventBus基本使用 EventBus基于观察者模式的Android事件分发总线。 从这个图可以看出,Even...

  • Guava之EventBus源码

    最近需要使用事件驱动,打算使用EventBus管理事件的注册和分发。于是仔细阅读了下Guava的EventBus实...

  • EventBus3源码之旅

    前言 EventBus在Android项目中用来实现事件分发,对项目模块进行解耦。EventBus最初很受亲睐,但...

  • 基于RxJava的Android事件分发--QxBus

    前言:在实现这个事件分发的时候也考虑过EventBus,因为种种原因没有采用,但是项目有个事件分发又非常方便,于是...

  • EventBus源码阅读记录

    EventBus源码阅读记录 EventBus是一个Android上用的消息分发的类库,非常灵活好用,主要的原理是...

网友评论

      本文标题:事件分发库-EventBus

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