Android EventBus的使用

EventBus,它是一个基于观察者模式的事件发布/订阅框架,开发者可以通过极少的代码去实现多个模块之间的通信,而不需要以层层传递接口的形式去单独构建通信桥梁。从而降低因多重回调导致的模块间强耦合,同时避免产生大量内部类。它拥有使用方便,性能高,接入成本低和支持多线程的优点,实乃模块解耦、代码重构必备良药。而这段话的重点就是模块之间的通讯,例如activity之间,fragment之间等,另外一个优点是,可以之间接收数据方的运行线程并指定线程;

1.添加依赖

compile 'org.greenrobot:eventbus:3.0.0'

2.注册

 EventBus.getDefault().register(this);
 //底层默认使用单例,在要数据接收的类中接收,最好写在setContentView后面

3.定义回调

 //兄弟们,看好方法名,不一样的;还有参数类型;

 @Subscribe
    public void get(String name){
        System.out.println("post"+"-"+name+"-strng-"+Thread.currentThread().getName());
    }

    @Subscribe
    public void get(int name){
        System.out.println("post"+"-"+name +  "-int-"+Thread.currentThread().getName());;
    }

//    @Subscribe(threadMode=ThreadMode.POSTING)
//    public void get(String name){
//        System.out.println("MainActivity"+name+Thread.currentThread().getName());
//    }
//
//    @Subscribe(threadMode=ThreadMode.POSTING)
//    public void get(int name){
//        System.out.println("MainActivity"+name +  Thread.currentThread().getName());;
//    }

    @Subscribe(threadMode = ThreadMode.BACKGROUND)
    public void get1(String name){
        System.out.println("BACKGROUND"+"-"+name +"-string-"+Thread.currentThread().getName());
    }

    @Subscribe(threadMode = ThreadMode.BACKGROUND)
    public void get1(int name){
        System.out.println("BACKGROUND"+"-"+name +"-int-"+ Thread.currentThread().getName());
    }

    @Subscribe(threadMode = ThreadMode.MAIN)
    public void get2(String name){
        System.out.println("main"+"-"+name +"-string-"+Thread.currentThread().getName());
    }

    @Subscribe(threadMode = ThreadMode.MAIN)
    public void get2(int name){
        System.out.println("main"+"-int-"+name + Thread.currentThread().getName());
    }

    @Subscribe(threadMode = ThreadMode.ASYNC)
    public void get3(String name){
        System.out.println("ASYNC"+"-"+name +"-string-"+Thread.currentThread().getName());
    }

    @Subscribe(threadMode = ThreadMode.ASYNC)
    public void get3(int name){
        System.out.println("ASYNC"+"-"+name + "-int-"+Thread.currentThread().getName());
    }

细心的同学可能已经发现了,参数名一样,类型不一样,方法名也有一样的;
忘了说,这些毁掉实在注册了得类中的;

4.发送数据

//加入我们发送的是一个String类型的数据;主线程发出的;
 EventBus.getDefault().post("wsl");

5.结果输出

09-11 11:04:38.202 22757-22757/com.example.wsl.csdn I/System.out: post-wsl-strng-main
09-11 11:04:38.204 22757-22757/com.example.wsl.csdn I/System.out: main-wsl-string-main
09-11 11:04:38.205 22757-22854/com.example.wsl.csdn I/System.out: BACKGROUND-wsl-string-pool-1-thread-1
09-11 11:04:38.207 22757-22855/com.example.wsl.csdn I/System.out: ASYNC-wsl-string-pool-1-thread-2


结果分析:

首先,我们发送了一个“wsl”,输出了4个结果,但是我们定义了8个回掉方法,从结果看的出只回调了参数是string的4个方法,看到这里是不是懂了?毁掉那个方法,和方法名没有关系,和post发送的数据类型有关,只要符合这个类型的所有回调方法都会被执行;

   因为post实在ui线程发出的,所以第一条输出结果是在main线程,其他3个结果因为我们指定了threadmode,会回掉在我们指定的线程;

  下面的三个Poster,则是EventBus能在不同的线程执行回调方法的核心,我们根据不同的回调方式来看:

    POSTING(在调用post所在的线程执行回调):不需要poster来调度,直接运行。

    MAIN(在UI线程回调):如果post所在线程为UI线程则直接执行,否则则通过mainThreadPoster来调度。

    BACKGROUND(在Backgroud线程回调):如果post所在线程为非UI线程则直接执行,否则则通过backgroundPoster来调度。

    ASYNC(交给线程池来管理):直接通过asyncPoster调度。

6.常见问题

在实际使用过程中你可能会遇到这样的问题,那就是有多个方法的参数都是一样的,如都是string,这样他们都会接收到post的数据,所以,有什么办法能是单一发送数据呢? 那就是Class<MyActivity> ,这样就解决了问题,么么哒!

eventbus还有高级的用法,这里就不再说了,后面再完善!!!
有些同学添加依赖后会报错,找不到complie方法,我也有过,不会再问我!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值