Android Dagger - 有两个模块如何共享提供者方法

时间:2015-01-26 01:10:35

标签: android dagger

假设我有两个模块,我将如何从一个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提供的方法。

1 个答案:

答案 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,如果你想看看如何创建一个范围图,但它基本上只是得到一个全局图的副本,你可以添加它,在活动死后,范围图得到垃圾收集