Android内存指南中的“避免dependency injection框架”是否也适用于Dagger?

所以我遇到了有关Android内存性能的最佳实践。

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

他们说

避免dependency injection框架

使用Guice或RoboGuice等dependency injection框架可能会很有吸引力,因为它们可以简化您编写的代码,并提供适用于testing和其他configuration更改的自适应环境。 但是,这些框架往往会通过扫描代码来进行注释,从而执行大量的stream程初始化,即使您不需要,也可能需要将大量的代码映射到RAM中。 这些映射的页面被分配到干净的内存中,所以Android可以放弃它们,但是直到页面被长时间留在内存中才会发生。

但是他们自称是匕首的匕首呢? 不知道我应该去哪一个?

这个build议并不适用于所有的dependency injection框架。

..framework [像Guice一样工作]倾向于通过扫描你的代码进行注释来执行很多进程初始化,即使你不需要它,也可能需要大量的代码映射到RAM中

因此,如果使用扫描所述[运行时间]注释的DI / IoC框架,意味着[过度]使用reflection,则此原因不适用。 虽然匕首确实使用了注释,但这些注释的使用方式不同于 Guice 1,并避免了所述的问题。

由于Dagger被写为“ Android和Java的快速dependency injection器”,作者为此devise了它,并相信它适合这样一个目标 – 继续尝试。


1匕首使用编译时注释( 主要是 ),而不是依靠运行时注释和reflection; 这是运行时注释扫描和reflection导致内存指南警告的问题。

Android团队最近更新了他们的build议, build议开发者使用Dagger 2 。

以前的build议是基于高昂的反思成本。 由于匕首2不再使用reflection – 匕首1 – 他们相信它可以在Android应用程序中使用,而无需运行成本或内存使用

(免责声明:我是Dagger 2的团队经理。)

Dagger的创造者@JakeWharton也写了一个简单的“注射”框架,称为Butterknife

因为所有的RoboGuice转换者都抱怨Dagger缺乏“视图注入” 。

你这样使用它:

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