使用Dagger 2进行依赖注入 - Producers

原文:http://frogermcs.github.io/dependency-injection-with-dagger-2-producers/

本文是在Android中使用Dagger 2框架进行依赖注入的系列文章中的一部分。今天我们将探索下Dagger Producers - 使用Java实现异步依赖注入的Dagger2的一个扩展。

初始化性能问题

我们都知道Dagger 2是一个优化得很好的依赖注入框架。但是即使有这些全部的微优化,仍然在依赖注入的时候存在可能的性能问题 - “笨重”的第三方库和/或我们那些主线程阻塞的代码。

依赖注入是在尽可能短的时间内在正确的地方传递所请求的依赖的过程 - 这些都是Dagger 2做得很好的。但是DI也会去创建各种依赖。如果我们需要花费几百毫秒创建它们,那么以纳秒级的时间去提供依赖还有什么意义呢?

当我们的app创建了一系列繁重的单例并立即由Dagger2提供服务之后也许可能没有这么重要。但是在我们创建它们的时候仍然需要一个时间成本 - 大多数情况下决定了app启动的时间。

这问题(已经给了提示怎么去调适它)已经在我之前的一篇博客中描述地很详细了:Dagger 2 - graph creation performance

在很短的时间内,让我们想象这么一个场景 - 你的app有一个初始化的界面(SplashScreen),需要在app启动后立即做一些需要的事情:

  • 初始化所有tracking libs(Goole Analytics, Crashlytics)然后发送第一份数据给它们。

  • 创建用于API和/或数据库通信的整个栈。

  • 我们试图的交互逻辑(MVP中的Presenters,MVVM中的ViewModels等等)。

即使我们的代码是优化地非常好的,但是仍然有可能有些额外的库需要几十或者几百毫秒的时间来初始化。在我们启动界面之前将展示必须初始化和交付的所有请求的依赖(和它们的依赖)。这意味着启动时间将会是它们每一个初始化时间的总和。

由 AndroidDevMetrics 测量的示例堆栈可能如下所示: