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方法,我也有过,不会再问我!!