2015-07-11 1 views
3

Когда я начинаю RoboGuice андроид приложение, появляется следующее сообщение в логах:RoboGuice: Использование полного отражения. Попробуйте использовать процессор аннотаций RoboGuice для лучшей производительности

roboguice.RoboGuice: Использование полного отражения. Попробуйте использовать процессор аннотации RoboGuice для повышения производительности.

Что это значит?

Все мои действия (включая мою MainActivity) распространяются на классы RoboGuice. Может быть, я что-то упустил, и есть способ улучшить производительность RoboGuice, которого я сейчас не делаю.

Примечание: Я использую RoboBlender

+0

Вы используете [RoboBlender?] (Https://github.com/roboguice/roboguice/wiki/RoboBlender-wiki) – mbmc

+0

Да, @tibo, я использую Roboblender – Antonio

+0

основе [код] (https: //github.com/roboguice/roboguice/blob/bf9043c5af085408a5d26ea8e5f857e8d0a9bdab/roboguice/src/main/java/roboguice/RoboGuice.java#L253), он не может найти вашу базу данных аннотаций. – mbmc

ответ

1

RoboGuice основан на Google Guice библиотеки, которая является отражением основанная на зависимостях. К сожалению, Guice плохо работает на Android. Например, в моем последнем проекте для инициализации инжектора потребовалось от 1 до 1,5 секунд.

В какой-то момент разработчик RoboGuice решил улучшить производительность своей библиотеки, выполняя некоторую работу во время компиляции, и это то, о чем RoboBlender. Он создает базу данных аннотаций во время компиляции, и RoboGuice использует эту базу данных во время выполнения для поиска точек впрыска. Вы можете узнать больше о RoboBlender here. Этот подход потребовал больших изменений в Guice, поэтому автору RoboGuice пришлось его разветвить и даже отправил в Guice pull request. Но этот PR был отклонён главным образом потому, что он противоречит идее библиотеки Guice (как рамочной рамки DI).

Извините за такое длинное введение и вот ответ на ваш вопрос. При вызове RoboGuice.setUseAnnotationDatabases(false) вы просите RoboGuice обрабатывать все во время выполнения через отражение. Другими словами RoboGuice работает так же, как оригинальный Guice, и это не очень быстро. Когда вы пытаетесь использовать базы данных аннотаций и сбои приложений, это может случиться, потому что базы данных аннотаций не могут быть найдены. Может быть, вы забыли добавить <meta-data android:name="roboguice.annotations.packages" android:value="..."/> в AndroidManifest.xml?

Наконец, я бы не рекомендовал использовать Guice или RoboGuice на Android, потому что первый очень медленный, а последний сломан по дизайну. Гораздо лучше использовать библиотеку DI времени компиляции, такую ​​как Dagger, и для ее переключения не требуется много времени.

+1

Привет @ Майкл! Большое вам спасибо за большой ответ! Теперь все имеет смысл! Я удалил «RoboGuice.setUseAnnotationDatabases (false)», и исключение не появилось, возможно, я делал что-то неправильно. О вашем ответе вы заработали баунти – Antonio

-3

Я рекомендую вам использовать нож для масла. Это гораздо проще, если вы используете Android Studio также есть плагин в которые позволяют произвести инъекцию вида авто только один раз нажать:

полезная документация: https://github.com/avast/android-butterknife-zelezny

+0

Благодарим вас за советы, но все мое приложение было выполнено с помощью RogoGuice. Я буду использовать его в следующем приложении – Antonio

+1

ButterKnife не имеет ничего общего с инъекцией зависимости. – mbmc

2

Roboguice теперь перешел на версию 4.0.0. Это доступно на github, как филиал rg-4-final. В Gradle, вы можете использовать его как

compile 'org.roboguice:roboguice:4.0.0' 
provided 'org.roboguice:roboblender:4.0.0' 

Я имел проблемы с получением Roboblender работать раньше, но в 4.0.0 он работает как шарм.

Однако есть изменения. Посмотрите на пример Astroboy, как его использовать.Вы не продлевают деятельности или фрагментов больше, Вы вводите пользователей в каждой из них, как так:

RoboGuice.getInjector(this).injectMembers(this); 

Они отказались @InjectView и @InjectResource, теперь используют для инъекций нож для масла взглядов, и ресурсы, которые вы получите в обычном Android путь. Не забудьте инициализировать Roboguice в вашей заявке:

RoboGuice.setupBaseApplicationInjector(this, new MyModule(), new OtherModule()); 

Наслаждайтесь!

+0

Не, если бы они просто обновили документацию сайта до 4.0 :) – mjstam

+0

Я не знаю, почему они этого не сделали. – Christine

+0

'Нет реализации для android.content.Context был связан. при поиске android.content.Context' Использование roboguice 4.0 –

 Смежные вопросы

  • Нет связанных вопросов^_^