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

前言

第一次写博客,希望有不足之处多多指教,文中有错误之处也请大家批评指出。

关于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的索引优化功能就讲完了,还是那句话,第一次写博客,有不足之处,多多谅解,也请多多指教,这其实也只是我的一个随笔,
学习记录罢了,希望不要喷我,如果那里说错了,也请告诉我,谢谢。

你可能感兴趣的:(Android随笔)