例如,假设我的主应用程序模块定义如下:
//com.example.android.MyAppModule.java @Module( includes = AnalyticsModule.class,injects = { <snip> } ) public class MyAppModule { // varIoUs provides }
我有另外一个这样定义的模块,它设置一个ErrorReporter接口并为其提供具体的实现.
// com.example.android.analytics.AnalyticsModule.java @Module( addsTo = MyAppModule.class,injects = { MyApp.class } ) public class AnalyticsModule(){ // ErrorReporter is a public interface and ErrorReporterImpl is a package-local final concrete class that implements it @Provides @Singleton ErrorReporter providesErrorReporter(ErrorReporterImpl reporter) { return reporter }; }
在我的Application类中,我设置了如下对象图:
// com.example.android.MyApp.java public class MyApp extends Application { @Inject ErrorReporter errorReporter; @Override public void onCreate() { super.onCreate(); applicationGraph = ObjectGraph .create(new MyAppModule()) .plus(new AnalyticsModule()); applicationGraph.inject(this); errorReporter.initialize(); } }
当我运行匕首编译器时,我得到这样的东西:
Graph validation Failed: Module Inclusion Cycle: 0. com.example.android.analytics.AnalyticsModule included by com.example.android.MyAppModule 1. com.example.android.modules.MyAppModule included by com.example.android.analytics.AnalyticsModule 0. com.example.android.analytics.AnalyticsModule
我在这做错了什么?我认为它与includes / addsTo有关,但当我删除它时,我得到其他错误.
如果我从MyAppModule中删除includes = AnalyticsModule.class,我会得到如下内容:
com.example.android.analytics.ErrorReporter Could not be bound with key com.example.android.analytics.ErrorReporter required by com.example.android.MyApp for com.example.android.MyAppModule
如果我完全放弃了AnalyticsModule然后将provideErrorReporter移交给MyAppModule,那么一切都很好,但是我必须将我的具体impl类公开,以便我可以在其他模块中使用它.
解决方法
在你的例子中,你正在做:
applicationGraph = ObjectGraph .create(new MyAppModule()) .plus(new AnalyticsModule());
这最终会在父/子关系中创建两个图形,这不是您需要的图形.在Android应用程序中,您需要一个应用程序图形.
您可以简单地删除addsTo,MyAppModule将自动实例化AnalyticsModule,或者如果您想避免动态初始化,则可以将两者都传入:
applicationGraph = ObjectGraph.create(new MyAppModule(),new AnalyticsModule());
模块包含周期是因为这两个模块之间存在周期性关系,模块本身必须形成非循环的配置图. MyAppModule包括AnalyticsModule,而AnalyticsModule又包含MyAppModule. (addsTo是一个不太严格的includes =用于指定从父图获得的东西)
原文地址:https://www.jb51.cc/android/317850.html
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。