Android消息传递之EventBus 3.0使用详解

EventBus示例:

之前做图片社交App的时候,需要处理一个点赞数据的同步,比如在作品的详情页点赞 需要同时更新列表页该作品的点赞数量,这里还是以此为例。

 1.)build.gradle添加引用

compile 'org.greenrobot:eventbus:3.0.0'

1

compile 'org.greenrobot:eventbus:3.0.0'

2.)定义一个事件类型

public class DataSynEvent { private int count; public int getCount() { return count; } public void setCount(int count) { this.count = count; } }

1234567891011

public class DataSynEvent {    private int count;     public int getCount() {        return count;    }     public void setCount(int count) {        this.count = count;    }}

3.)订阅/解除订阅

订阅

EventBus.getDefault().register(this);//订阅

1

EventBus.getDefault().register(this);//订阅

解除订阅

EventBus.getDefault().unregister(this);//解除订阅

1

EventBus.getDefault().unregister(this);//解除订阅

4.)发布事件

EventBus.getDefault().post(new DataSynEvent());

1

EventBus.getDefault().post(new DataSynEvent());

5.)订阅事件处理

@Subscribe(threadMode = ThreadMode.MAIN) //在ui线程执行 public void onDataSynEvent(DataSynEvent event) { Log.e(TAG, "event---->" + event.getCount()); }

1234

@Subscribe(threadMode = ThreadMode.MAIN) //在ui线程执行    public void onDataSynEvent(DataSynEvent event) {        Log.e(TAG, "event---->" + event.getCount());    }

ThreadMode总共四个:
  • NAIN UI主线程
  • BACKGROUND 后台线程
  • POSTING 和发布者处在同一个线程
  • ASYNC 异步线程

6.)订阅事件的优先级

事件的优先级类似广播的优先级,优先级越高优先获得消息

@Subscribe(threadMode = ThreadMode.MAIN,priority = 100) //在ui线程执行 优先级100 public void onDataSynEvent(DataSynEvent event) { Log.e(TAG, "event---->" + event.getCount()); }

1234

@Subscribe(threadMode = ThreadMode.MAIN,priority = 100) //在ui线程执行 优先级100    public void onDataSynEvent(DataSynEvent event) {        Log.e(TAG, "event---->" + event.getCount());    }

7.)终止事件往下传递

发送有序广播可以终止广播的继续往下传递,EventBus也实现了此功能

EventBus.getDefault().cancelEventDelivery(event) ;//优先级高的订阅者可以终止事件往下传递

1

EventBus.getDefault().cancelEventDelivery(event) ;//优先级高的订阅者可以终止事件往下传递

8.)处理代码混淆

-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); }

12345678910

-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);}

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏技术小黑屋

Android中Handler引起的内存泄露

在Android常用编程中,Handler在进行异步操作并处理返回结果时经常被使用。通常我们的代码会这样实现。

702
来自专栏青青天空树

EventBus轻松使用

  由greenrobot组织贡献(该组织还贡献了greenDAO),一个Android事件发布/订阅轻量级框架,功能:通过解耦发布者和订阅者简化Android...

802
来自专栏androidBlog

HandlerThread源码分析

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/gdutxiaoxu/article/details/...

371
来自专栏于晓飞的专栏

Android开发从GC root分析内存泄漏

我们常说的垃圾回收机制中会提到GC Roots这个词,也就是Java虚拟机中所有引用的根对象。我们都知道,垃圾回收器不会回收GC Roots以及那些被它们间接引...

832
来自专栏JadePeng的技术博客

一起读源码之zookeeper(1) -- 启动分析

从本文开始,不定期分析一个开源项目源代码,起篇从大名鼎鼎的zookeeper开始。 为什么是zk,因为用到zk的场景实在太多了,大部分耳熟能详的分布式系统都有...

6576
来自专栏walterlv - 吕毅的博客

.NET 中 GetProcess 相关方法的性能

2018-08-19 07:04

553
来自专栏james大数据架构

Android中Application的应用

当android程序启动时系统会创建一个 application对象,用来存储系统的一些信息。通常我们是不需要指定一个Application的,这时系统会自动帮...

1746
来自专栏小灰灰

Greenrobot-EventBus源码学习(六)

EventBus 深入学习六之消息发送 消息推送 发布消息的业务方没有限制,任何人,可以在任何地方,任何时间推送一条消息(或者说触发一个自定义事件) 代码一览...

1739
来自专栏androidBlog

一步步拆解 LeakCanary

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/gdutxiaoxu/article/de...

531
来自专栏移动开发面面观

Android NDK中的UI线程

在Android中,UI线程是一个很重要的概念。我们对UI的更新和一些系统行为,都必须在UI线程(主线程)中进行调用。

1074

扫码关注云+社区