【发布时间】:2016-07-22 04:02:39
【问题描述】:
我正在尝试使用 Dagger2 使我的应用程序更好,代码更易于维护
我在我的项目中注入了匕首(听起来很有趣)。
我创建了ApplicationComonent 组件,它在我的项目中完美运行。
这是我的代码。
@Singleton
@Component(modules = {
ApplicationModule.class,
ThreadingModule.class,
NetworkModule.class,
DatabaseModule.class,
ServiceModule.class,
ParseModule.class,
PreferencesSessionModule.class})
public interface ApplicationComponent {
ActivityComponent activityComponent(ActivityModule activityModule);
void inject(BaseActivity baseActivity);
void inject(MainAppActivity mainAppActivity);
void inject(MyApplication application);
void inject(BaseFragment baseFragment);
void inject(MyService service);
void inject(RegistrationIntentService service);
}
我像这样在MyApplication 类中创建我的组件实例
private void initializeAndInjectComponent() {
mApplicationComponent =
DaggerApplicationComponent
.builder()
.threadingModule(new ThreadingModule(1))
.applicationModule(new ApplicationModule(this))
.networkModule(new NetworkModule(
MyService.API_SERVER_BASE_URL,
MyService.TIMEOUT))
.build();
mApplicationComponent.inject(this);
}
我可以获取组件以便注入我的Activities
MyApplication application = MyApplication.get(this);
application.getApplicationComponent().inject(this);
一切都很完美。
要添加每个方法以及模块类都用@Singleton范围注解,所有与ApplicationComponent相关的模块
现在我想让依赖关系变得更好,我已经看到了很多自定义范围的示例,例如 @PerActivity、@PerFragment。我有很多问题,但稍后再说。
所以我创建了ActivityComponent
@PerActivity
@Subcomponent(
modules = {
NetworkServiceModule.class,
ActivityModule.class,
PermissionModule.class
})
public interface ActivityComponent {
Activity activity();
void inject(BaseActivity baseActivity);
}
所有模块都是这样的
@PerActivity
@Module
public class ActivityModule {
private Activity mActivity;
public ActivityModule(Activity activity) {
this.mActivity = activity;
}
@Provides
@PerActivity
Activity provideActivity() {
return this.mActivity;
}
}
我的BaseActivity 中有以下依赖项
// Dependencies from ApplicationComponent
@Inject
protected ApplicationSettingsManager mApplicationSettingsManager;
@Inject
protected ScheduledThreadPoolExecutor mPoolExecutor;
// Dependencies from ActivityComponent
@Inject
protected SpiceManager mSpiceManager;
@Inject
protected PermissionController mPermissionController;
在我的onCreate() 方法中,我注入如下
MyApplication application = MyApplication.get(this);
application.getApplicationComponent().activityComponent(new ActivityModule(this)).inject(this);
在创建子组件ActivityComponent之前是
MyApplication application = MyApplication.get(this);
application.getApplicationComponent().inject(this);
现在我遇到了一个错误
Error:(34, 10) error: com.octo.android.robospice.SpiceManager cannot be provided without an @Inject constructor or from an @Provides- or @Produces-annotated method.
BaseActivity.mSpiceManager
[injected field of type: com.octo.android.robospice.SpiceManager mSpiceManager]
我无法弄清楚问题出在哪里,我错过了什么。 我对 dagger2 中作用域的问题。
Dagger 2 忽略了除 @Singleton 之外的所有内容,对吗?
我不明白组件的寿命是如何管理的?我只有一个想法
当你使用
@Singleton注解时,匕首是在某个静态池中创建对象,该对象将在整个应用程序生命周期中存在,并在JVM进程(dalvik VM,ART)实例被销毁时被销毁。当您使用任何其他注解时,只是为了让您作为开发人员更好地维护代码,
@PerActivity、@PerFragment只是自定义注解而已。如果您将@PerFragment组件放在 Application 类中,它将与 Application 一样存在。我对吗 ?
1234563 /p>
对于上述问题的任何帮助,我将不胜感激。
更新
感谢David Medenjak 的精彩回答,我对Dagger2 有了更深入的了解。
我也刚刚发现了问题,就我现在使用单独的Activity 组件而言,我忘记了ApplicationComponent 中的两行并将我的MainActivity 中的inejction 更改为ActivityComponent 而不是ApplicationComponent ,所以它肯定无法解析来自子组件的依赖关系。
void inject(BaseActivity baseActivity);
void inject(MainAppActivity mainAppActivity);
现在一切正常,我喜欢Dagger2 和分离的架构。
【问题讨论】:
-
我遇到了和你一样的问题。从您更新的答案中,我仍然不确定要修复什么。您能否分享一些源代码,以便我更好地了解?
标签: java android dependency-injection scope dagger-2