Использует ли "Избегайте рамки инъекций зависимостей" в Руководстве по памяти 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...
  }
}