EventBus3.0性能优化之添加索引(Index)

来源:互联网 发布:uber隐瞒数据泄露事件 编辑:程序博客网 时间:2024/05/16 15:34

前言

第一次写博客,希望有不足之处多多指教,文中有错误之处也请大家批评指出。关于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"));

结果运行是
err

错误: 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: testEventTwo03-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<Class<?>, SubscriberInfo> SUBSCRIBER_INDEX;    static {        SUBSCRIBER_INDEX = new HashMap<Class<?>, 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<Class<?>, SubscriberInfo> SUBSCRIBER_INDEX;static {        SUBSCRIBER_INDEX = new HashMap<Class<?>, 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的索引优化功能就讲完了,还是那句话,第一次写博客,有不足之处,多多谅解,也请多多指教,这其实也只是我的一个随笔,学习记录罢了,希望不要喷我,如果那里说错了,也请告诉我,谢谢。
1 0
原创粉丝点击