2016-11-22 2 views
2

Notre application Android utilise actuellement Otto EventBus, qui utilise la réflexion. Nous voulons éviter les frais généraux de la réflexion, mais garder la flexibilité. Est-ce que Guava's event bus utilise la réflexion? Qu'en est-il de GreenRobot?Les EventBus de GreenRobot et de Guava utilisent-ils la réflexion?

Si ce n'est pas le cas, ils utilisent la génération de code ou quelque chose comme ça?

+0

GreenRobot EventBus3 utilise APT au lieu de réflexion, autant que je sache – EpicPandaForce

+1

"Nous voulons éviter les frais généraux de réflexion" Êtes-vous bien sûr que c'est en fait un problème dans y notre application? Quand nous (Prototype) avons créé un code Otto il y a quatre ans, le nombre d'abonnés a dû être ridicule pour que cela puisse réellement faire la différence. Et cela remonte à l'époque de Dalvik et avant même de fixer la réflexion d'annotation sur API 14+. Franchement, de tels commentaires sont souvent le résultat de l'optimisation de quelque chose qui n'est pas réellement un problème et qui n'a pas été mesuré avec précision. –

+0

@Jake Wharton Nous ne l'avons pas mesuré. En règle générale, je tente d'éviter la réflexion lorsque je veux optimiser les performances. Si vous avez des données à partager, je serais heureux de changer d'avis. – Ginandi

Répondre

4

Otto n'a jamais été aussi riche en fonctionnalités que EventBus de GreenRobot - pas de mode de threading, par exemple, donc c'est un bon débarras. Et Otto a été déprécié en faveur de RxJava - ce qui est énorme pour de nombreux projets (opinion personnelle).



Mais afin de réduire l'utilisation de la réflexion, GreenRobot EventBus 3.x is able to build an index in compilation time using APT plutôt que la réflexion d'exécution.

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


Index Préalables: Notez que seules @subscriber méthodes peuvent être indexés pour lesquels l'abonné et classe d'événements sont publiques. En outre, en raison des limitations techniques du traitement des annotations Java lui-même, les annotations @Subscribe ne sont pas reconnues à l'intérieur des classes anonymes.

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" 
    } 
} 

Et

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