Android之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 才能收到信息

时间: 2024-10-20 09:07:21

Android之EventBus使用的相关文章

Android之EventBus使用详解

一.概述 当Android项目越来越庞大的时候,应用的各个部件之间的通信变得越来越复杂,例如:当某一条件发生时,应用中有几个部件对这个消息感兴趣,那么我们通常采用的就是观察者模式,使用观察者模式有一个弊病就是部件之间的耦合度太高,在这里我将会详细介绍Android中的解耦组建EventBus的使用.EventBus是一款针对Android优化的发布/订阅事件总线.主要功能是替代Intent,Handler,BroadCast在Fragment,Activity,Service,线程之间传递消息.

Android 中 EventBus 的使用(3):多线程事件处理

在这一系列教程的最后一篇中,我想谈谈GR的EventBus,在处理多线程异步任务时是多么简单而有效. AsyncTask, Loader和Executor…… 拜托! Android中有很多种执行异步操作的方法(指平行于UI线程的).AsyncTask对于用户来说是最简单的一种机制,并且只需要少量的设置代码即可.然而,它的使用是有局限的,正如Android官方文档中所描述的: AsyncTask被设计成为一个工具类,在它内部包含了Thread和Handler,但它本身并不是通用线程框架的一部分.

76.Android之EventBus源码解析

转载:http://p.codekk.com/blogs/detail/54cfab086c4761e5001b2538 1. 功能介绍 1.1 EventBus EventBus 是一个 Android 事件发布/订阅框架,通过解耦发布者和订阅者简化 Android 事件传递,这里的事件可以理解为消息,本文中统一称为事件.事件传递既可用于 Android 四大组件间通讯,也可以用户异步线程和主线程间通讯等等.传统的事件传递方式包括:Handler.BroadCastReceiver.Inter

Android 中 EventBus 的使用(2):缓存事件

在上一篇文章中,我曾提到我所选择的是Green Robot提供的EventBus(Android平台),而且这并非只是我一个人的选择.在最近一次查看中,我发现选择它的人数已经是Otto(由Jake Wharton和其他大神们在Square上所提供的版本)的两倍之多了.GR的版本显然比Otto有更多的性能提升,但最令我动心的地方在于它添加了很多新功能.今天我就打算谈谈其中的一项:通过sticky事件进行事件缓存. sticky是什么? sticky事件就是指在EventBus内部被缓存的那些事件.

【Android】EventBus 源码解析

EventBus 源码解析 本文为 Android 开源项目实现原理解析 中 EventBus 部分项目地址:EventBus,分析的版本:ccc2771,Demo 地址:EventBus Demo分析者:Trinea,校对者:扔物线,校对状态:未完成 1. 功能介绍 1.1 EventBus EventBus 是一个 Android 事件发布/订阅框架,通过解耦发布者和订阅者简化 Android 事件传递,这里的事件可以理解为消息,本文中统一称为事件.事件传递既可用于 Android 四大组件

【Android】EventBus两分钟入门实例

1.EventBus优缺点 EventBus 作为 Android 开发中常用的框架,拥有着许多优点: 调度灵活.不依赖于 Context,使用时无需像广播一样关注 Context 的注入与传递.父类对于通知的监听和处理可以继承给子类,这对于简化代码至关重要:通知的优先级,能够保证 Subscriber 关注最重要的通知:粘滞事件(sticky events)能够保证通知不会因 Subscriber 的不在场而忽略.可继承.优先级.粘滞,是 EventBus 比之于广播.观察者等方式最大的优点,

Android 使用EventBus发送消息接收消息

基本使用 自定义一个类 public class LoginEvent { private String code;//是否成功 public LoginEvent(String code) { this.code = code; } public String getCode() { return code; } public void setCode(String code) { this.code = code; }} 在要接收消息的页面注册: eventBus.register(this

Android事件总线 浅谈 EventBus

EventBus官方文档是这么写的:EventBus is a publish/subscribe event bus optimized for Android. 也就是说EventBus是Android下高效的发布/订阅事件总线机制. EventBus可以代替传统的Intent,Handler,Broadcast或接口函数在Fragment,Activity,Service,线程之间传递数据,执行方法. 我们先来看看官方文档对EventBus的介绍: simplifies the commu

Guava: 事件总线EventBus

EventBus 直译过来就是事件总线,它使用发布订阅模式支持组件之间的通信,不需要显式地注册回调,比观察者模式更灵活,可用于替换Java中传统的事件监听模式,EventBus的作用就是解耦,它不是通用的发布订阅系统,也不能用于进程间通信.可用于Android的EventBus库主要有这几个:Google出品的Guava,Guava是一个庞大的库,EventBus 只是它附带的一个小功能,因此实际项目中使用并不多.用的最多的是greenrobot/EventBus,这个库的优点是接口简洁,集成方