Android EventBus官方文档学习

来源:互联网 发布:科学怪人 知乎 编辑:程序博客网 时间:2024/05/29 13:48

原理

官方说明

这是官方的一张图片说明,很能说明问题,毕竟官方是最权威的

Android传统的Intent,Handler,Broadcast或接口函数,在Fragment,Activity,Service线程之间传递数据,执行方法,这样做消息的发送者和接收者之间耦合就很高,

EventBus可以替代它们,将发布者和接收者(也说是订阅者)之间分离,
通过解耦发布者和订阅者简化Android事件传递

说白了EventBus就是 观察者设计模式

使用步骤:

1. 将EventBus导入项目

Gradle 依赖 compile 'org.greenrobot:eventbus:3.0.0'

2. 定义事件-也就是传递的数据

(也就是一个没有任何特别要求的Java实体类)

public class MessageEvent {    public final String message;    public MessageEvent(String message) {        this.message = message;    }}

2. 准备观察者(也就是消息的接收者)

  • 观察者需要实现事件处理方法,当事件消息被发送时,此方法将会被调用。
// This method will be called when a MessageEvent is posted (in the UI thread for Toast)@Subscribe(threadMode = ThreadMode.MAIN)public void onMessageEvent(MessageEvent event) {    Toast.makeText(getActivity(), event.message, Toast.LENGTH_SHORT).show();}// This method will be called when a SomeOtherEvent is posted@Subscribepublic void handleSomethingElse(SomeOtherEvent event) {    doSomethingWith(event);}
  • 观察者必须先要注册才能接收事件event(注销),在activity和fragment中,可以根据生命周期来注册和注销EventBus.
@Overridepublic void onStart() {    super.onStart();    EventBus.getDefault().register(this);}@Overridepublic void onStop() {    EventBus.getDefault().unregister(this);    super.onStop();}

3. 发送消息事件

你可以在任何地方发送消息,所有的已经注册的、并且匹配消息事件类型的观察者(消息接收者)都会收到该事件

 EventBus.getDefault().post(new MessageEvent("Hello everyone!"));

注意:在写接收消息的方法是,方法名可以自定义,权限必须是public,参数必须是一个只要接收的参数类型是一致的,那么四个方法都可以接收到发送的信息

事件分发的线程:

处理多线程问题

1. ThreadMode.MAIN

表示这个方法在主线程中执行(适合做异步加载,可以将子线程加载到数据直接设置到UI界面里)

    @Subscribe(threadMode = ThreadMode.MAIN)    public void MessageEventBus(EventBusMessage eventBusMessage){       //在TextView显示接收的消息,从这个类里拿属性.       tv_title.setText(eventBusMessage.Message);       Log.d("eventBusThread","ThreadMode.MAIN "+Thread.currentThread().getName());    }

2. ThreadMode.POSTING

表示该方法和消息发送方在同一个线程.

    @Subscribe(threadMode = ThreadMode.POSTING)    public void MessageEventBus1(EventBusMessage eventBusMessage){       Log.d("eventBusThread","ThreadMode.POSTING "+Thread.currentThread().getName());    }

3. ThreadMode.ASYNC

  1. 也表示在后台执行(也就是子线程执行),可以异步并发处理
    (适用于多个线程任务处理,内部有线程池管理,比如请求网络时,用这个方法,他会自动创建线程去请求)
  2. 无论发布者是在子线程还是主线程,该方法都会创建一个子线程,在子线程执行.
    @Subscribe(threadMode = ThreadMode.ASYNC)    public void MessageEventBus2(EventBusMessage eventBusMessage){       Log.d("eventBusThread","ThreadMode.ASYNC "+Thread.currentThread().getName());    } 

4. ThreadMode.BACKGROUND

  1. 表示该方法在后台运行(也就是子线程),不能够并发处理
  2. 如果发布者在子线程,那么该方法就在子线程执行
  3. 如果发布者在主线程,那么该方法就会创建一个子线程,在子线程运行.
    @Subscribe(threadMode = ThreadMode.BACKGROUND)    public void MessageEventBus3(EventBusMessage eventBusMessage){       Log.d("eventBusThread","ThreadMode.BACKGROUND "+Thread.currentThread().getName());    }

EventBus的黏性事件使用

一些带有重要数据的事件发布,例如,一个事件信号,一些初始化完成。或者如果你有传感器位置数据和你想抓住最近的值。 这些重要信息不需要我们来缓存,使用sticky event就可以了,EventBus会缓存最近发送的sticky event事件,然后sticky event可以交付给用户或显式查询。你不需要任何特殊的逻辑来考虑可用的数据。


如果一个sticky event在一段时间之前发送了

EventBus.getDefault().postSticky(new MessageEvent("Hello everyone!"));

现在有一个activity启动了,在注册的期间,所有的sticky观察者方法,将会立刻收到之前发送的sticky event.

@Overridepublic void onStart() {    super.onStart();    EventBus.getDefault().register(this);}// UI updates must run on MainThread@Subscribe(sticky = true, threadMode = ThreadMode.MAIN)public void onEvent(MessageEvent event) {       textField.setText(event.message);}@Overridepublic void onStop() {    EventBus.getDefault().unregister(this);        super.onStop();}

正因为上面所说的,所以有时需要手动检查事件,还可能需要删除事件,这样他们不会被发送了。这里是removeStickyEvent方法

MessageEvent stickyEvent = EventBus.getDefault().getStickyEvent(MessageEvent.class);// Better check that an event was actually posted beforeif(stickyEvent != null) {    // "Consume" the sticky event    EventBus.getDefault().removeStickyEvent(stickyEvent);    // Now do something with it}

我们也可以重写上面的方法,如下:

MessageEvent stickyEvent = EventBus.getDefault().removeStickyEvent(MessageEvent.class);// Better check that an event was actually posted beforeif(stickyEvent != null) {    // Now do something with it}

这里是参考的文档,如果上面的看不明白,可以参考一下官方文档

官方引导

官方文档

百度百科

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 银行卡存款没有存进去怎么办 被黑网站黑钱了怎么办 饿了吗账户异常怎么办 单位里有人整你怎么办 乌鲁木齐信息采集结束后怎么办 头发很长时间不长怎么办啊 打嘟噜时间不长怎么办 阴茎勃起的时间不长怎么办 睡觉的时间不长怎么办 每次锻炼时间不长怎么办 微信好友不知道是谁怎么办 就一个软件闪退怎么办 葫芦侠修改闪退怎么办 戴尔游匣磁盘占用100怎么办 步步高家教机扫描笔不亮怎么办 社保卡手机号换了怎么办 香港公司进出口没有申报怎么办 智能电视右上角网络未连接怎么办 电子秤按键板不好用怎么办失灵 桑塔纳车钥匙锁车里了怎么办 舌头上有锯齿印怎么办 夏天有脚气脚臭怎么办 xp分辨率太高黑屏怎么办 农村淘宝标识类目没了怎么办 被投诉到食品监督局怎么办 被客户315投诉了怎么办 给人打不接受调解怎么办 失业证年审忘了怎么办 工商年检过期4天怎么办 个体营业执照年审过期了怎么办 企业年报密码忘了怎么办 税务年报报错了怎么办 工商证过期5年怎么办 车年检标志丢了怎么办 年检标志打错了怎么办 贵州个体出租车工商执照年检怎么办 驾驶证考试预约提示网络繁忙怎么办 帝豪显示屏花屏怎么办 注册公司居委会不盖章怎么办 营业执照名字和店名不一样怎么办 开炸鸡店没经验怎么办