EventBus通信小能手,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)