第一次使用Dagger2。
在我的Android应用程序中,我有一个扩展Application的MyApplication类。 我还有一个ImageAssistant类,它是相关图像处理方法的集合。 在我的MyApplicaiton类中,我曾经为所有要使用的活动实例化ImageAssistant。
现在我正在尝试使用Dagger2,但我不知道如何在提供ImageAssistant的模块中传递上下文
这就是我的代码的样子:
public class ImageAssistant {
Context context;
public ImageAssistant(Context context){
this.context = context;
}
// A bunch of methods...
}
public class MyApplication extends Application {
public ImageAssistant imageAssistant;
public void onCreate() {
imageAssistant = new ImageAssistant(this);
}
}
现在,输入Dagger 2,这就是我所拥有的
public class ImageAssistant {
Context context;
@Inject
public ImageAssistant(Context context){
this.context = context;
}
// A bunch of methods...
}
public class MyApplication extends Application {
@Inject
public ImageAssistant imageAssistant;
public void onCreate() {
}
}
包中的.modules:
AppModule.java
@Module
public class AppModule {
@Provides
ImageAssistant provideImageAssistant() {
return new ImageAssistant(); // HERE A CONTEXT IS NEEDED. WHERE TO GET IT FROM?
}
}
编辑:这就是我的模块现在的样子,但我仍然不知道如何将所有内容组合在一起:
@Module
public class AppModule {
private MyApplication application;
public AppModule(MyApplication application) {
this.application = application;
}
@Provides
Context provideApplicationContext() {
return this.application;
}
@Provides
ImageAssistant provideImageAssistant(ImageAssistant imageAssistant) {
return imageAssistant;
}
}
这是AppComponent:
@Singleton
@Component(modules = {AppModule.class})
public interface AppComponent {
ImageAssistant provideImageAssistant();
Context context();
}
答案 0 :(得分:1)
您的模块应如下所示:
@Module(injects = {MainActivity.class})
public class AppModule {
private MyApplication application;
public AppModule(MyApplication application) {
this.application = application;
}
@Provides
public ImageAssistant provideImageAssistant() {
return new ImageAssistantImpl(application); // implementation of ImageAssistant
}
}
Activity
中的用法:
public class MainActivity extends Activity{
@Inject
ImageAssistant imageAssistant;
@Override
protected void onCreate(Bundle savedInstanceState) {
SharedObjectGraph.inject(this);
imageAssistant.doSomething();
}
}
不要忘记在ObjectGraph
课程中初始化Application
。我使用SharedObjectGraph
静态类在整个应用中共享从ObjectGraph
创建的AppModule
。
阅读building the graph部分。
答案 1 :(得分:1)
我做了类似的事情:
@Module
public class ApplicationModule {
private final SpendApplication app;
public ApplicationModule(SpendApplication app) {
this.app = app;
}
@Provides
@Singleton
public Context providesContext() {
return app;
}
}
和
@Module
public class GattManagerModule {
@Provides
@Singleton
GattManager providesGattManager(Context context) {
return new GattManager(context);
}
}
并声明所有使用它的地方:
@Component(modules = { ApplicationModule.class, GattManagerModule.class, ...})
@Singleton
public interface ApplicationComponent {
void inject(MainScreenActivity activity);
...
}
在我的应用程序类中:
@Override
public void onCreate() {
super.onCreate();
component = DaggerApplicationComponent.builder()
.applicationModule(new ApplicationModule(this))
.build();
}
在我的MainActivity中:
@Inject
GattManager gattManager;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
getAppComponent().inject(this);
}