"Избегайте фреймворков инъекций зависимостей" в руководстве по памяти Android также применяется к Dagger?


Так что я столкнулся с этой передовой практикой на Android статей о производительности памяти.

http://developer.android.com/training/articles/memory.html

Они сказали:

избегайте фреймворков инъекций зависимостей

использование инфраструктуры внедрения зависимостей, такой как Guice или RoboGuice может будьте привлекательны, потому что они могут упростить код, который вы пишете и предоставляете адаптивная среда, которая полезна для тестирования и другие конфигурационные изменения. Однако эти рамки, как правило, выполняют много инициализации процесса путем сканирования вашего кода для аннотаций, которые может потребоваться значительное количество кода для отображения в ОЗУ даже если тебе это не нужно. Эти сопоставленные страницы выделяются в очистить память Android могут их бросить, но этого не произойдет до тех пор, пока страницы были оставлены в памяти в течение длительного периода времени.

а насчет Кинжал которые они утверждают, что быстро. Не уверен, какой из них я должен пойти?

3 61

3 ответа:

эта рекомендация делает не применяются одинаково ко всем фреймворкам внедрения зависимостей.

..фреймворки [которые работают как Guice], как правило, выполняют много инициализации процесса с помощью сканирование кода для аннотаций, который может требуется значительное количество кода для отображения в ОЗУ даже если вам это не нужно..

таким образом, при использовании структуры DI/IoC это не поиск упомянутые [run-time] аннотации, подразумевающие [чрезмерное] использование отражения, тогда эта причина не применяется. В то время как Кинжал использует аннотации это используется по-разному чем Guice1 и избежать указанной проблемы.

поскольку Кинжал был написан как " A быстро зависимость инжектор для Android и Java", авторы разработали его для этой цели и считают, что он подходит для такого цель - идти вперед, дать ему попробовать.


1 Dagger использует аннотации времени компиляции (ну,в основном) вместо того, чтобы полагаться на аннотации и отражение во время выполнения; именно сканирование и отражение аннотаций во время выполнения вызывает проблему, о которой предупреждало руководство по памяти.

команда Android недавно обновила свою рекомендацию до предложите разработчикам использовать кинжал 2.

предыдущая рекомендация была основана на высокой стоимости отражение. Поскольку Кинжал 2 больше не использует отражение-Кинжал 1 сделал - они верят в это "может использоваться в приложениях для Android без ненужных затрат времени выполнения или использования памяти".

(отказ от ответственности: я менеджер команды Dagger 2.)

создатель Кинжала, @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...
  }
}