Использует ли "Избегайте рамки инъекций зависимостей" в Руководстве по памяти Android для кинжала?
Итак, я столкнулся с этой лучшей практикой в статьях Android по производительности памяти.
http://developer.android.com/training/articles/memory.html
Они сказали
Избегайте инфраструктур инъекции зависимостей
Использование инфраструктуры инъекций зависимостей, таких как Guice или RoboGuice, может быть привлекательными, поскольку они могут упростить код, который вы пишете и адаптивную среду, полезную для тестирования и другие изменения конфигурации. Однако эти структуры, как правило, выполняют много инициализации процесса путем сканирования вашего кода для аннотаций, который может потребовать значительного количества кода для отображения в ОЗУ даже если вам это не нужно. Эти сопоставленные страницы выделяются в чистую память, так что Android может их сбросить, но этого не произойдет, пока страницы остались в памяти в течение длительного периода времени.
Но как насчет Dagger, который, по их утверждению, является быстрым. Не знаете, на что я должен пойти?
Ответы
Ответ 1
Эта рекомендация не применяется в равной степени ко всем структурам инъекций зависимостей.
.. рамки [, которые работают как Guice], как правило, выполняют много инициализации процесса, просматривая ваш код для аннотаций, что может потребовать значительного количества кода для отображения в ОЗУ, даже если вам это не нужно.
Таким образом, при использовании рамки DI/IoC, которая не сканирует указанные аннотации [run-time], подразумевая [чрезмерное] использование отражения, тогда эта причина не применяется. В то время как Dagger использует аннотации, это используется по-другому чем Guice 1 и избежать указанной проблемы.
Поскольку Dagger был написан как "быстрая инжекция зависимости для Android и Java", авторы разработали его для этой цели и считают, что он подходит для такой цели - идите вперед, попробуйте.
1 Кинжал использует аннотации времени компиляции (ну, в основном) вместо того, чтобы полагаться на аннотации и размышления во время выполнения; это сканирование и отражение аннотаций во время выполнения, что вызывает проблему, о которой предупреждал гид памяти.
Ответ 2
Команда Android недавно обновила свою рекомендацию предложить разработчикам использовать Dagger 2.
Предыдущая рекомендация была основана на высокой стоимости размышлений. Поскольку Dagger 2 больше не использует отражения - Dagger 1 сделал - они считают, что "может быть использован в приложениях Android без лишних затрат времени на использование или использование памяти.
(Отказ от ответственности: я менеджер команды Dagger 2).
Ответ 3
Создатель кинжала @JakeWharton также написал более простую концепцию "инъекции" под названием Butterknife
потому что все новообращенные RoboGuice жаловались на отсутствие "просмотр инъекции" с кинжалом.
Вы используете его следующим образом:
class ExampleActivity extends Activity {
@InjectView(R.id.title) TextView title;
@InjectView(R.id.subtitle) TextView subtitle;
@InjectView(R.id.footer) TextView footer;
@Override public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.simple_activity);
ButterKnife.inject(this);
// TODO Use "injected" views...
}
}