2016-11-22 14 views
2

В настоящее время в Android-приложении используется Otto EventBus, в котором используется отражение. Мы хотим избежать накладных расходов, но сохраняем гибкость. Guava's event bus использование отражение? Как насчет GreenRobot?Используют ли эффекты GreenRobot's и Guava EventBus?

Если они этого не делают, они используют генерацию кода или что-то в этом роде?

+0

GreenRobot EventBus3 использует APT вместо отражения, AFAIK – EpicPandaForce

+1

"Мы хотим, чтобы избежать накладных расходов отражения" Вы уверен, что это на самом деле проблема в y наше приложение? Когда мы (Квадрат) прототипировали код, сгенерированный Отто 4 года назад, число подписчиков должно было быть смехотворным, чтобы оно имело реальную разницу. И это было в дни Дальвика, а также до того, как они зафиксировали отражение аннотации на API 14+. Честно говоря, такие комментарии часто являются результатом оптимизации того, что на самом деле не является проблемой, и не было точно измерено. –

+0

@ Джейк Уортон Мы этого не измерили. Как правило, я стараюсь избегать отражения, когда хочу оптимизировать производительность. Если у вас есть данные, которыми вы можете поделиться, я с удовольствием передумаю. – Ginandi

ответ

4

Отто никогда не был таким же функциональным, как EventBus от GreenRobot, например, без потоков, так что это хорошее избавление. И Отто был устаревшим в пользу RxJava - который является массовым излишеством для многих проектов (личное мнение).



Но для того, чтобы уменьшить использование отражения, GreenRobot EventBus 3.x is able to build an index in compilation time using APT, а не во время выполнения отражение.

http://greenrobot.org/eventbus/documentation/subscriber-index/


Index Предпосылки: Обратите внимание, что только @Subscriber методы могут быть проиндексированы, для которых абонент и класс события является общедоступным. Кроме того, из-за технических ограничений обработки аннотации Java, аннотации @Subscribe не распознаются внутри анонимных классов.

buildscript { 
    dependencies { 
     classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8' 
    } 
} 



apply plugin: 'com.neenbedankt.android-apt' 

dependencies { 
    compile 'org.greenrobot:eventbus:3.0.0' 
    apt 'org.greenrobot:eventbus-annotation-processor:3.0.1' 
} 

apt { 
    arguments { 
     eventBusIndex "com.example.myapp.MyEventBusIndex" 
    } 
} 

И

EventBus.builder().addIndex(new MyEventBusIndex()).installDefaultEventBus(); 
// Now the default instance uses the given index. Use it like this: 
EventBus eventBus = EventBus.getDefault();