EventBus通信小能手
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通信小能手的更多相关文章
- Scala进阶之路-Spark底层通信小案例
Scala进阶之路-Spark底层通信小案例 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.Spark Master和worker通信过程简介 1>.Worker会向ma ...
- ACM_跳坑小能手(暴力)
跳坑小能手 Time Limit: 2000/1000ms (Java/Others) Problem Description: GDUFE-GAME现场有一个游戏场地人头窜动,围观参与游戏的学生在场 ...
- k8s家族Pod辅助小能手Init容器认知答疑?
k8s家族Pod辅助小能手Init容器认知答疑? k8s集群Init 容器是一种特殊容器,职责是在Pod的生命周期中作为应用容器的前置启动容器. 在很多应用场景中,在 Pod 内的应用容器正式启动之前 ...
- java即时通信小例子
学习java一段时间了,今天写来一个即时通信的小例子练手在其过程中也学到了一些知识拿出来和大家分享,请路过的各位大神多多赐教... 好了下面讲一下基本的思路: 首先,编写服务器端的程序,简单点说吧就是 ...
- Linux下进程间管道通信小作业
在进行这次作业之前,我们先来看看什么是管道吧! 管道是Linux中很重要的一种通信方式,是把一个程序的输出直接连接到另一个程序的输入,常说的管道多是指无名管道,无名管道只能用于具有亲缘关系的进程之间, ...
- Java IO 与 NIO 服务器&客户端通信小栗子
本篇包含了入门小栗子以及一些问题的思考 BIO package com.demo.bio; import java.io.*; import java.net.ServerSocket; import ...
- grpc基础讲解和golang实现grpc通信小案例
grpc简介 gRPC由google开发,是一款语言中立.平台中立.开源的远程过程调用系统 gRPC客户端和服务端可以在多种环境中运行和交互,例如用java写一个服务端,可以用go语言写客户端调用 g ...
- ngrok 外网访问小能手
以前在学校的时候想把自己做的网站发布让外网访问,可是又没有虚拟服务器和域名就显得异常的麻烦,曾经试过花生壳映射,效果虽然还不错,但是略显麻烦.今天找到一个更方便的小工具--ngrok ! 简单的介绍一 ...
- C# Socket通信 小案例
本文将编写2个控制台应用程序,一个是服务器端(server),一个是客户端(client), 通过server的监听,有新的client连接后,接收client发出的信息. server代码如下: u ...
随机推荐
- 初识servlet--未完成
servlet到底是什么呢?今天我们一起看一下. 首先说下servlet是干啥的.servlet主要干这么一个事情:创建动态的问页面. servlet主要的功能是,访问外网,连接外部接口.它可以做如下 ...
- java二维数组学习(转)
转自:http://blog.csdn.net/java1992/article/details/5808709,在这里谢过了 /* * java学习: * 二维数组的使用: */public cla ...
- 11 Python+selenium对下拉框(select)进行处理
[环境信息] Python3.4+IE+windows2008 [Select下拉框处理] 1.对于如图1的下拉框,可以用selenium自带的Select类进行选择. 2.定位示例: from se ...
- Javascript面对对象. 第二篇
但是还有一个问题,就是识别的问题,因为根本无法搞清楚他们到底是哪个对象的实例. 1.构造函数 function CreateObject(name,age){ //创建一个对象,使用构造函数的对象都是 ...
- weex官方demo weex-hackernews代码解读(1)
一.介绍 weex 是阿里出品的一个类似RN的框架,可以使用前端技术来开发移动应用,实现一份代码支持H5,IOS和Android.最新版本的weex已默认将vue.js作为前端框架,而weex-hac ...
- index_merge引发的死锁排查
概述 前几天排查了一个死锁问题,最开始百思不得其解,因为发生死锁的两个事务是单语句事务,语句类型相同(where属性列相同,仅值不同),而且语句都走了相同的索引,但最终确实发生了死锁.通过定位排查发现 ...
- 视频直播SDK-ios版
IOS视频直播接入说明 一.名词解释 分辨率:用于计算机视频处理的图像,以水平和垂直方向上所能显示的像素数来表示分辨率.常见视频分辨率的有1080P即1920x1080,720P即1080x720,6 ...
- Laravel的ORM入门
源码目录在\vendor\laravel\framework\src\Illuminate\Database\Eloquent\Relations下 关系:一对多(One To Many) 场景:每篇 ...
- RunTime.getRuntime().exec()运行脚本命令介绍和阻塞
java在企业级项目开发中,无论是强制性的功能需要,还是为了简便java的实现,需要调用服务器命令脚本来执行.在java中,RunTime.getRuntime().exec()就实现了这个功能. ...
- Java原生API操作XML
使用Java操作XML的开源框架比较多,如著名的Dom4J.JDOM等,但个人认为不管你用那个框架都要对JDK原生的API有所了解才能更得心应手的应用.本篇就来简单了解下原生的XML API. JAV ...