1、EventBus简介

EventBus 是由 greenrobot 组织开发的一个 Android 事件发布/订阅轻量级框架,特点:代码简洁,是一种发布订阅设计模式(观察者设计模式)。

EventBus 可以代替 Android 传统的 Intent, Handler, Broadcast或接口函数,在 Fragment, Activity, Service 线程之间传递数据,执行方法。

(可能线程间的简单通信看不出EventBus的优势,但是进程之间通信代码繁多,特别是复杂的数据格式,而EventBus能让通信变得简单)

2、EventBus的优势

1.简化了组件间的通讯

2.分离了事件的发送者和接受者

3.在Activity、Fragment和线程中表现良好

4.避免了复杂的和易错的依赖关系和声明周期问题

5.使得代码更简洁,性能更好

6.更快,更小(约50k的jar包)

3、EventBus大概原理

1.EventBus底层采用的是注解和反射的方式来获取订阅方法信息(首先是注解获取,若注解获取不到,再用反射)1

2.当前订阅者是添加到Eventbus 总的事件订阅者的subscriptionByEventType集合中

3.订阅者所有订阅的事件类型添加到typeBySubscriber 中,方便解注册时,移除事件

4、使用步骤

  1.关联库  compile 'org.greenrobot:eventbus:3.0.0'

2.设置权限(需要联网,用于测试网络请求)  <uses-permission android:name="android.permission.INTERNET" />

3. 注册  EventBus.getDefault().register(this);

4. 发送信息 EventBus.getDefault().post("这是发送了一条String语句");

5. 接受信息

@Subscribe()  //里面什么都没有表示默认
    public void getInfo(String a) {
        Log.e("获取到的字符串:" ,a);   //String a  一般是定义为一个类,简单的话传String基本数据格式即可
    }  // public 不能换成 private

6.退出时记得销毁注册

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

5、案例   demo 点击下载: http://www.cnblogs.com/wujiancheng

测试主线程与子线程通信(在子线程中联网请求,在主线程中弹出从子线程发过来的信息),测试优先级,测试粘性的作用(Stickly)

1.线程间通信

发送信息为EventBus.getDefault().post(new XXX("http://www.tngou.net/api/memo/comment")); //这里的XXX要对应

那么接收信息的为

@Subscribe(threadMode = ThreadMode.ASYNC) 
public void TestHttp(XXX event){ ......}

EventBus.getDefault().post("I am a String");

接收信息为

@Subscribe(threadMode = ThreadMode.ASYNC)
public void TestHttp(String info){ ......} //随便写个String 类型即可

发送信息url给子线程

  @Override
        public void onClick(View view) {
            //发送信息
            EventBus.getDefault().post(new HttpEvent("http://www.tngou.net/api/memo/comment"));  //这里需要写一个解析的类,很简单只有两个节点
        }

HttpEvent与HttpEvent2代码一样,如下
public class HttpEvent {
    private String msg;

    public HttpEvent(String msg) {
        this.msg = msg;
    }

    public String getMsg(){
        return msg;
    }

}

子线程发送信息

//这里使用XUtils来请求网络,具体的可以下载demo查看
@Subscribe(threadMode = ThreadMode.ASYNC) public void TestHttp(HttpEvent event){ String jsonData = event.getMsg(); //联网请求 Log.e("线程名:" ,Thread.currentThread().getName()); org.xutils.x.http().get(new RequestParams(jsonData), new Callback.CommonCallback<String>() { @Override public void onSuccess(String result) { Log.e("联网请求","联网成功==" + result); Gson gson = new Gson(); JsonData data = gson.fromJson(result,JsonData.class); //发送信息 EventBus.getDefault().post(new HttpEvent2(data.getMsg() +"-------"+ data.isStatus())); } @Override public void onError(Throwable ex, boolean isOnCallback) { Log.e("联网请求","联网失败,请检查网络"); } @Override public void onCancelled(CancelledException cex) { } @Override public void onFinished() { } }); }

接受信息并显示出来

@Subscribe(threadMode = ThreadMode.MAIN)
    public void getMessage(HttpEvent2 event2) {
        Toast.makeText(this,event2.getMsg(),Toast.LENGTH_SHORT).show();
        Log.e("线程名:" ,Thread.currentThread().getName());
    }

运行效果如下图:

子线程请求联网,主线程得到信息,根据图下

    

  EventBus3.0 四种线程模式

1.@Subscribe(threadMode = ThreadMode.POSTING)

订阅者执行的线程与事件的发布者所在的线程为同一个线程,也是EventBus默认的线程模式。

2.@Subscribe(threadMode = ThreadMode.MAIN)

在Android的主线程中运行,不能执行一些耗时的任务。

3.@Subscribe(threadMode = ThreadMode.BACKGROUND)

  在后台线程中执行,如果发布者是在主线程中进行的事件发布,那么订阅者将会重新开启一个子线程运行

若是发布者在不是在主线程中进行的事件发布,那么这时候订阅者就在发布者所在的线程中执行任务。

4.@Subscribe(threadMode = ThreadMode.ASYNC),

在独立的线程中执行,不管发布者是在主线程还是在子线程中进行事件的发布,订阅者都是在重新开启一个线程来执行任务。



2.测试优先级

priority (默认优先级为0)越大优先级越大,即最先执行。必须在同一个线程中测试,两个线程没有优先级的可比性.

发送信息
        @Override
        public void onClick(View view) {
            EventBus.getDefault().post(new HttpEvent3("测试优先级"));
        }

接收信息

 @Subscribe(priority =88 )
    public void getPriority(HttpEvent3 event3) {
        Log.e("priority =88:" ,event3.getMsg());
    }
    @Subscribe(priority =10 )
    public void getPriority2(HttpEvent3 event3) {
        Log.e("priority =10:" ,event3.getMsg());
    }
    @Subscribe(priority =77 )
    public void getPriority3(HttpEvent3 event3) {
        Log.e("priority =77:" ,event3.getMsg());
        EventBus.getDefault().cancelEventDelivery(event3); //中断事件传递
    }
    @Subscribe(priority =99 )
    public void getPriority4(HttpEvent3 event3) {
        Log.e("priority =99:" ,event3.getMsg());
    }

优先级只有三个,从大到小的顺序执行,因为再77的时候中断事件传递,所以没有priority =10

3.测试粘性的作用

  粘性EventBus类型与粘性broadcast,在不注册的情况下发送信息,信息会缓存这,当注册的时候,能接收到之前发的信息

//测试粘性
EventBus.getDefault().postSticky("测试粘性Stickly"); //通过postSticky发送
//注册
EventBus.getDefault().register(this);

接收信息

  @Subscribe(sticky = true)
    public void getStickly(String a) {
        Log.e("sticky = true:" ,a);
    }

    @Subscribe(sticky = false)
    public void getStickly2(String a) {
        Log.e("sticky = false:" ,a);
    }

// sticky = true 才能收到信息

EventBus通信小能手的更多相关文章

  1. Scala进阶之路-Spark底层通信小案例

    Scala进阶之路-Spark底层通信小案例 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.Spark Master和worker通信过程简介 1>.Worker会向ma ...

  2. ACM_跳坑小能手(暴力)

    跳坑小能手 Time Limit: 2000/1000ms (Java/Others) Problem Description: GDUFE-GAME现场有一个游戏场地人头窜动,围观参与游戏的学生在场 ...

  3. k8s家族Pod辅助小能手Init容器认知答疑?

    k8s家族Pod辅助小能手Init容器认知答疑? k8s集群Init 容器是一种特殊容器,职责是在Pod的生命周期中作为应用容器的前置启动容器. 在很多应用场景中,在 Pod 内的应用容器正式启动之前 ...

  4. java即时通信小例子

    学习java一段时间了,今天写来一个即时通信的小例子练手在其过程中也学到了一些知识拿出来和大家分享,请路过的各位大神多多赐教... 好了下面讲一下基本的思路: 首先,编写服务器端的程序,简单点说吧就是 ...

  5. Linux下进程间管道通信小作业

    在进行这次作业之前,我们先来看看什么是管道吧! 管道是Linux中很重要的一种通信方式,是把一个程序的输出直接连接到另一个程序的输入,常说的管道多是指无名管道,无名管道只能用于具有亲缘关系的进程之间, ...

  6. Java IO 与 NIO 服务器&客户端通信小栗子

    本篇包含了入门小栗子以及一些问题的思考 BIO package com.demo.bio; import java.io.*; import java.net.ServerSocket; import ...

  7. grpc基础讲解和golang实现grpc通信小案例

    grpc简介 gRPC由google开发,是一款语言中立.平台中立.开源的远程过程调用系统 gRPC客户端和服务端可以在多种环境中运行和交互,例如用java写一个服务端,可以用go语言写客户端调用 g ...

  8. ngrok 外网访问小能手

    以前在学校的时候想把自己做的网站发布让外网访问,可是又没有虚拟服务器和域名就显得异常的麻烦,曾经试过花生壳映射,效果虽然还不错,但是略显麻烦.今天找到一个更方便的小工具--ngrok ! 简单的介绍一 ...

  9. C# Socket通信 小案例

    本文将编写2个控制台应用程序,一个是服务器端(server),一个是客户端(client), 通过server的监听,有新的client连接后,接收client发出的信息. server代码如下: u ...

随机推荐

  1. Java数据类型转换浅析

    Java数据类型转换分为两种:自动类型转换和强制类型转换. 数据类型转换的关键是数据类型相应的表数范围大小 1.自动类型转换: 概念:小范围数据类型会自动转化成大范围数据类型 实例: int a=10 ...

  2. Linux驱动技术(八) _并发控制技术

    为了实现对临界资源的有效管理,应用层的程序有原子变量,条件变量,信号量来控制并发,同样的问题也存在与驱动开发中,比如一个驱动同时被多个应用层程序调用,此时驱动中的全局变量会同时属于多个应用层进程的进程 ...

  3. udp 双机通信(服务器循环检测)2

    此文摘自:http://blog.csdn.net/qinpeng100423/article/details/8980423,谢谢了 自己上一篇写的udp通信,只能运行一次,参考了这位博主的,只是把 ...

  4. Android Studio 错误集

    错误列表与解决方案: 1.Android studio Gradle project sync failed Android studio 构建项目出错 Error:Unable to start t ...

  5. 2017年2月16日 分析下为什么spring 整合mybatis后为啥用不上session缓存

    因为一直用spring整合了mybatis,所以很少用到mybatis的session缓存. 习惯是本地缓存自己用map写或者引入第三方的本地缓存框架ehcache,Guava 所以提出来纠结下 实验 ...

  6. 缓冲流自动把getchar()填充

    #include"stdio.h" #include"conio.h" #include<stdlib.h> int main() { char c ...

  7. Animate自定义动画

    在jQuery中出了基本的动画之外,还有用户 可以自定义的函数,Animate() 用于创建自定义动画的函数. apI上指出: 这个函数的关键在于指定动画形式及结果样式属性对象.这个对象中每个属性都表 ...

  8. 网站Web业务架构从小到大演变

    有一天,我突发奇想创建了一个站点,基于 LNMP 架构,起初只有我自己访问,后来因为我点儿正,访问量越来越大,所以最终导致下面的架构演变. 1.单台机器 单台机器因为只是一个小站,访问量一天也没有多少 ...

  9. 字符串查找算法总结(暴力匹配、KMP 算法、Boyer-Moore 算法和 Sunday 算法)

    字符串匹配是字符串的一种基本操作:给定一个长度为 M 的文本和一个长度为 N 的模式串,在文本中找到一个和该模式相符的子字符串,并返回该字字符串在文本中的位置. KMP 算法,全称是 Knuth-Mo ...

  10. SSIS 数据流的连接和查找转换

    在SSIS的数据流组件中,SSIS引擎使用Merge Join组件和 Lookup组件实现TSQL语句中的inner join 和 outer join 功能,Lookup查找组件的功能更类似TSQL ...