第一次写博客,希望有不足之处多多指教,文中有错误之处也请大家批评指出。
关于EventBus3.0的使用我就不说了,网上已经有很多优秀的文章讲解了,主要是说说3.0内关于提升性能的一个东东,就是添加索引.
关于EventBus的索引,在EventBus 3.0用法详解中有写道
将你的每一个事件的参数类封装为一个类,然后加入这一段之后即可将EventBus3.0性能提高一倍(项目app层的gradle文件)
//原文为
//provided 'de.greenrobot:eventbus-annotation-processor:3.0.0-beta1'
//目前最新版本
provided 'org.greenrobot:eventbus-annotation-processor:3.0.1'
立马新建项目试试:
public static class TestEvent {
public String test;
public TestEvent(String test) {
this.test = test;
}
}
public static class TestEventTwo {
public String test;
public TestEventTwo(String test) {
this.test = test;
}
}
}
---------------------activity-----------------------
@Subscribe(threadMode = ThreadMode.BACKGROUND)
public void onEventTest(MEventIndex.TestEvent event) {
Log.i("test",event.test);
}
@Subscribe(threadMode = ThreadMode.MAIN,sticky = true,priority = 1)
public void onTestEvent(MEventIndex.TestEventTwo event){
Log.i("test",event.test);
}
---------------------------------------------------
EventBus.getDefault().post(new MEventIndex.TestEvent("testEvent"));
EventBus.getDefault().post(new MEventIndex.TestEventTwo("testEventTwo"));
结果运行是
错误: No option eventBusIndex passed to annotation processor
翻译:注释处理器没有选项eventBusIndex
什么意思?我想是不是少了操作,或者是要在Application中注册自己写的EventIndex,然后经过一番研究,发现EventBus类下有一个addIndex方法,具体代码如下
EventBus.builder().addIndex(new SubscriberInfoIndex() {
@Override
public SubscriberInfo getSubscriberInfo(Class> subscriberClass) {
SubscriberMethodInfo[] infos = new SubscriberMethodInfo[2];
infos[0] = new SubscriberMethodInfo("onEventTest", MEventIndex.TestEvent.class, ThreadMode.BACKGROUND);
infos[1] = new SubscriberMethodInfo("onTestEvent", MEventIndex.TestEventTwo.class, ThreadMode.MAIN,1,true);
return new SimpleSubscriberInfo(MEventIndex.class, true, infos);
}
});
我在Application中添加了这段代码后,发现还是不行,网上各种查询关于EventBus3.0的文档,发现并没有相关的任何资料或使用,只有本文开头那篇文章中提到了,但也仅仅是提到了(我想他也没有在项目中试过吧- -,或者他并不觉得这是一个问题。)
进入EventBus Github主页,也没有对于这个Index的使用说明,于是乎只能自己进入Demo(EventBusTest)查看,
结果发现在该项目gradle文件内有如下几段代码:
图1
图2
注意,在此Demo里面只有一个gradle文件,但是我们的项目有2个,一个在工程的根目录,一个在app目录下,图1 中的buildscript是写在工程根目录下gradle文件中,但是apply plugin要写在app目录下,图2 apt则是写在app目录下gradle文件中,其中eventBusIndex属性名不能变,值”org.greenrobot.eventbus.EventBusTestsIndex”可以随便写,但是不能跟你项目中的任何一个类一样,否则会报类重复错误!加上这俩段代码后,程序运行正常!
03-22 15:08:25.367 15544-15544/com.zxz.mapp I/test: testEventTwo
03-22 15:08:25.375 15544-15604/com.zxz.mapp I/test: testEvent
我的gradle代码
apt {
arguments {
eventBusIndex "org.eventbus.test.Event"
}
}
我们来看看项目
可以看到在我们的项目 app 层下build/generated/source/apt/debug目录下生成了一个类
该类的目录与我们在eventBusIndex 的值中写的相对应,再看看类里面是什么
package org.eventbus.test;
...
/** This class is generated by EventBus, do not edit. */
public class Event implements SubscriberInfoIndex {
private static final Map, SubscriberInfo> SUBSCRIBER_INDEX;
static {
SUBSCRIBER_INDEX = new HashMap, SubscriberInfo>();
putIndex(new SimpleSubscriberInfo(com.zxz.mapp.activitys.MainTabActivity.class, true,
new SubscriberMethodInfo[] {
new SubscriberMethodInfo("onEventTest", com.zxz.mapp.model.MEventIndex.TestEvent.class,
ThreadMode.BACKGROUND),
new SubscriberMethodInfo("onTestEvent", com.zxz.mapp.model.MEventIndex.TestEventTwo.class, ThreadMode.MAIN,
1, true),
}));
}
private static void putIndex(SubscriberInfo info) {
SUBSCRIBER_INDEX.put(info.getSubscriberClass(), info);
}
@Override
public SubscriberInfo getSubscriberInfo(Class> subscriberClass) {
SubscriberInfo info = SUBSCRIBER_INDEX.get(subscriberClass);
if (info != null) {
return info;
} else {
return null;
}
}
}
包名org.eventbus.test,类名Event,实现SubscriberInfoIndex 接口,是不是觉得很熟悉,没错,就是我之前有写到的addIndex()方法中的参数,证明我之前的思路并没有错,看看里面的具体实现
private static final Map, SubscriberInfo> SUBSCRIBER_INDEX;
static {
SUBSCRIBER_INDEX = new HashMap, SubscriberInfo>();
putIndex(new SimpleSubscriberInfo(com.zxz.mapp.activitys.MainTabActivity.class, true,
new SubscriberMethodInfo[] {
new SubscriberMethodInfo("onEventTest", com.zxz.mapp.model.MEventIndex.TestEvent.class,
ThreadMode.BACKGROUND),
new SubscriberMethodInfo("onTestEvent", com.zxz.mapp.model.MEventIndex.TestEventTwo.class, ThreadMode.MAIN,
1, true),
}));
}
使用一个Map保存SubscriberInfo,也就是所有订阅者的接收方法,第一个参数为订阅者的Class(key),第二个参数为SubscriberMethodInfo数组,即内中所有订阅方法集合(Value):new SubscriberMethodInfo(方法名、eventType、ThreadMode、priority、sticky);然后
@Override
public SubscriberInfo getSubscriberInfo(Class> subscriberClass) {
SubscriberInfo info = SUBSCRIBER_INDEX.get(subscriberClass);
if (info != null) {
return info;
} else {
return null;
}
}
这就是接口内定义的方法getSubscriberInfo,通过subscriberClass(key订阅者)去获得SubscriberInfo (value,也就是订阅方法集合)。
至此,关于EventBus3.0的索引优化功能就讲完了,还是那句话,第一次写博客,有不足之处,多多谅解,也请多多指教,这其实也只是我的一个随笔,
学习记录罢了,希望不要喷我,如果那里说错了,也请告诉我,谢谢。