假设我有两个模块,我将如何从一个ActivityModule共享模块到另一个名为ModelModule的模块。以下是我到目前为止的情况:
@Module(
includes = ActivityModule.class,
library = true,
injects= {
MainModel.class,
})
public class ModelModule {
}
这里是activityModule:
@Module(
library = true,
injects= {
main.class,
MyIntentService.class,
})
public class ActivityModule {
//application context
Context context;
public ActivityModule(Context context){
this.context = context;
}
@Provides
@Singleton
AudioManager provideAudioManager(){return (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);}
@Provides
@Singleton
Vibrator provideVibratorManager(){return (Vibrator) context.getSystemService(Context.VIBRATOR_SERVICE);}
@Provides
SharedPreferences provideSharedPref(){
return PreferenceManager
.getDefaultSharedPreferences(context);
}
}
以下是将模块添加到对象图中的方法:
public class MainApplication extends Application {
private ObjectGraph objectGraph;
@Override
public void onCreate() {
super.onCreate();
Object[] modules = getModules().toArray();
objectGraph = ObjectGraph.create(modules);
// objectGraph.inject(this);
}
protected List<Object> getModules() {
return Arrays.<Object>asList(
new ActivityModule(this),
new ModelModule()
);
}
public void inject(Object object) {
objectGraph.inject(object);
}
public void addtoGraph(Object object) {
objectGraph.plus(object);
}
}
我的问题是每次我尝试使用ActivityModule应该提供的首选项时,来自MainModel类的首选项为null。我在ModelModule.java类中使用了includes关键字,因为我认为这样可以访问ActivityModule提供的方法。
答案 0 :(得分:1)
我的架构设置错了。需要做的是创建一种全局/根模块(让我们称之为ActivityModule.java)。然后让每个活动都有自己的模块,但使用注释dagger关键字“addsto”使用与ActivityModule相同的图形。我是这样做的:
定义一个ActivityModule(适用于您的应用的全局模块),如下所示:
@Module(
library = true,
injects= {
})
public class ActivityModule {
Context context;
public ActivityModule(Context context){
this.context = context;
}
@Provides
@Singleton
AudioManager provideAudioManager(){return (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);}
@Provides
@Singleton
Vibrator provideVibratorManager(){return (Vibrator) context.getSystemService(Context.VIBRATOR_SERVICE);}
@Provides
SharedPreferences provideSharedPref(){
return PreferenceManager
.getDefaultSharedPreferences(context);
}
}
现在,如果您有一个名为main.java的活动,您可以创建一个名为MainModule的模块,其定义如下:
@Module(
addsTo = ActivityModule.class,//inherits from activityModule. it injects //this module into the same graph as it so it can see its providers
injects= {
main.class,
})
public class MainModule {
public MainModule(){
//some providers are here specific only to main.java, rest inherits from //activityModule
}
}
在我的应用程序中,我创建了一个范围图表来节省内存/资源。你可以去here,如果你想看看如何创建一个范围图,但它基本上只是得到一个全局图的副本,你可以添加它,在活动死后,范围图得到垃圾收集