功能:通过解耦发布者和订阅者简化Android事件传递
EventBus可以代替Android传统的Intent,Handler,Broadcast或接口函数,在Fragment,Activity,Service线程之间传递数据,执行方法。

特点:代码简洁,是一种发布订阅设计模式(观察者设计模式)

使用场景
用于线程间的通讯代替handler或用于组件间的通讯代替Intent
广泛用于团购,商城,社交等应用,比如易大师APP,易宸锋Application…
实践证明已经有一亿多的APP中集成了EventBus
优势编辑
简化了组件间的通讯。
分离了事件的发送者和接受者。
在Activity、Fragment和线程中表现良好。
避免了复杂的和易错的依赖关系和生命周期问题。
使得代码更简洁,性能更好。
更快,更小(约50k的jar包)。

1.下载 eventBus 3.0.jar:DownLoad
2.导入jar eventBus 3.0.jar 到android工程
3.注册

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

4.在activity onDestroy 调用是反注册

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

5.定义事件

public class MessageEvent {    private String message;    public MessageEvent(String message) {        this.message = message;    }    public String getMessage() {        return message;    }    public void setMessage(String message) {        this.message = message;    }}

6.订阅者 @Subscribe

    @Subscribe(threadMode = ThreadMode.MainThread)    public void onMoonEvent(MessageEvent messageEvent){        Log.i(TAG, Thread.currentThread().getName()+"收到");        Log.i(TAG, messageEvent.getMessage()+"收到");    }

7.发送事件

  ...  //事件发送EventBus.getDefault().post(new myMessage("事件"));  ...  ...


ThreadMode

PostThread(默认)[发布事件和接收事件是同一线程]:

该事件在哪个线程发布出来的,事件处理函数就会在这个线程中运行,也就是说发布事件和接收事件在同一个线程。任何事件处理情景使用这种模式必须保证能够快速地返回结果,否者可能将引起线程阻塞,当发布事件的线程是主线程时,还可能会出现ANR

MainThread[主线程,UI更新操作]:

不论事件是在哪个线程中发布出来的,该事件处理函数都会在UI线程中执行,任何事件处理使用这种模式必须保证快速地返回结果,从而避免阻塞主线程,该方法可以用来更新UI,但是不能处理耗时操作。

BackgroundThread [后台线程,不允许进行UI更新操作]:

当发布事件的线程不是主线程时,事件处理方法将会立即在该线程中被调用;如果发布时间的线程是主线程,EventBus会使用一个单例的后台线程调用事件处理函数,该后台线程将会按照时间顺序处理并交付所有的事件,任何事件处理场景使用这种模式必须保证快速地返回结果,从而避免阻塞线程。

Async[用于耗时操作]:

事件处理方法将会在异步的线程中被调用。该异步线程既不是主线程,也不是事件发布线程,在该模式下,发布事件不必等待事件处理方法执行完毕。在事件处理方法执行诸如网络请求等需要花费一定时间的任务时,推荐使用该模式。在使用过程中为了限制并发线程的数量,尽量避免在同一时间段内触发过多需要长时间执行的异步处理方法。


黏性事件

1.订阅黏性事件

//sticky=true@Subscribe(threadMode = ThreadMode.MainThread,sticky=true)    public void onMoonEvent(MessageEvent messageEvent){        Log.i(TAG, Thread.currentThread().getName()+"收到");        Log.i(TAG, messageEvent.getMessage()+"收到");}

2.推送黏性事件

EventBus.getDefault().postSticky(new myMessage("黏性事件"));

3.注册即可接收黏性事件


Priority 优先级
优先级必须针对同一类型(ThreadMode)的观察者,priority值越大,越先收到事件或消息。

更多相关文章

  1. SpringBoot 2.0 中 HikariCP 数据库连接池原理解析
  2. Android多线程断点续传详解与案例
  3. [置顶] Android:实现仿 美团/淘宝 多级分类菜单效果
  4. Android(安卓)旋转屏幕时禁止Activity重建
  5. 程序猿媛一:Android滑动翻页+区域点击事件
  6. Android(安卓)framework层 按键的处理流程
  7. 《Monkey Android》第6课点击事件的四种写法
  8. Android(安卓)触摸事件机制(四) ViewGroup中触摸事件详解
  9. EventBus第一章:初识,相见,了解,使用

随机推荐

  1. AndroidStudio中导入module详细介绍
  2. Android移植
  3. [IMX6Q][Android6.0.1_r3]之系统屏幕显示
  4. Android(安卓)6.0 运行时权限处理
  5. Android(安卓)MPAndroidChart不同区域背
  6. Android(安卓)Camera2+HAL3架构
  7. 关于android通过servlet访问MySql数据库
  8. Android(安卓)Input系统源码分析一(启动与
  9. Unity 打包错误:CommandInvokationFailur
  10. Android之kotlin里面本地图片BitmapFacto