Dagger可以用来在内容提供商上执行注入吗?

hom*_*man 12 android dagger

我最近一直在将Dagger集成到一个使用ContentProviders的项目中.我在自定义Application对象中创建了一个ObjectGraph实例,基本上在每个托管组件中:

  • 活动,
  • 分段,
  • 服务

...然后,我调用getApplication(),向下转换到我的自定义Application对象,并通过我的Application类中的一些自定义实现强制注入.这似乎是根据我在Square看到的人发布的样本进行注射的规定方法.

这种模式不适用于ContentProvider实例,因为它们的生命周期与Application对象的生命周期没有预期的关联,即ContentProviders可以,并且正如我经常观察的那样,是在创建Application对象之前创建的(对于我尚未理解的原因).

所以...有没有人有一个使用Dagger注入ContentProviders的好方法?到目前为止,我已经通过isInjected()在每个ContentProvider的接口方法(插入,查询,更新,删除)的开头调用...基本上是一种懒惰的初始化形式.但这似乎远非理想.是否有更规定的方法来注入ContentProviders?

Jak*_*ton 11

Application子类只是一个惯例,因为它通常是创建的第一个对象.我们的应用程序没有内容提供商,这就是我们使用它们的原因.没有什么可以说你不能把它放在其他地方.

您可以使用传统的单例模式来实例化并保持对它的引用ObjectGraph.

public final class Dagger {
  static ObjectGraph og;

  static ObjectGraph og() {
    if (og == null) {
      og = ObjectGraph.create(..);
    }
    return og;
  }
}
Run Code Online (Sandbox Code Playgroud)

第一个访问者将初始化将用于进程生命周期的实例.

如果您的内容提供商与主应用程序处于不同的进程,则此解决方案仍然有效.或者您可以在创建内容提供商时简单地创建图表,因为它将是唯一的消费者.当然,正常的多进程规则仍然适用,因此不会与其他进程共享任何实例.

  • @JakeWharton你可以参考dagger2如何做到这一点吗?我与内容提供商有同样的麻烦.谢谢 (4认同)