我想在 Android 上使用 Dagger 将一个实例注入Activity
到另一个类中,如下所示:
class PresentationLayer{
Activity mActivity;
@Inject
public PresentationLayer(Activity activity){
this.mActivity = activity;
}
public void presentData(User user){
((TextView)mActivity.findViewById(R.id.username))
.setText(user.getName());
//...
//...
}
}
我能够进行注射,但所有领域Activity
都null
在注射时。
这是我进行注射的方式:
MyActivity
本身就是一个模块。
@Module(
complete = false
)
class MainActivity extends Activity{
@Override
public void onCreate(Bundle bundle){
super.onCreate(bundle);
setContentView(R.layout.main_activity);
ObjectGraph objectGraph = CustomApplication.getObjectGraph();
PresentationLayer pres = objectGraph.get(PresentationLayer.class);
}
@Provides Activity provideActivity(){
return this;
}
}
这是我的主要模块
@Module(
entryPoints = PresentationLayer.class,
includes = MainActivity.class
)
class DaggerModule{
@Provides PresentationLayer providePresentation(Activity activity){
return new PresentationLayer(activity);
}
}
还有我Application
的引导对象图的类。
class CustomApplication extends Application{
private static ObjectGraph sObjectGraph;
@Override
public void onCreate(){
sObjectGraph = ObjectGraph.create(new DaggerModule());
}
static getObjectGraph(){
return sObjectGraph;
}
}
我正在寻找一种在调用setContentView
.
我该怎么做呢?
编辑1:
我让它像这样工作 - 但是我不确定这是否是“正确的方式”。我所做的是
- 将 Activity 传递给
Module
构造函数 - 确保我在完成之后构建,以便
ObjectGraph
将setContentView()
正确的Activity
实例传递给ObjectGraph
.
我Activity
的不再是匕首Module
。
这在代码中转换为以下内容:
@Module(
entryPoints = PresentationLayer.class
)
class DaggerModule{
private Activity mActivity;
public DaggerModule (Activity activity){
this.mActivity = activity;
}
@Provides PresentationLayer providePresentation(){
return new PresentationLayer(mActivity);
}
}
这就是我的Activity
样子:
class MainActivity extends Activity{
@Override
public void onCreate(Bundle bundle){
super.onCreate(bundle);
setContentView(R.layout.main_activity);
ObjectGraph objectGraph = CustomApplication.getObjectGraph(this);
PresentationLayer pres = objectGraph.get(PresentationLayer.class);
User user = //get the user here
pres.presentData(user);
}
}
这个解决方案似乎解决了 Jesse Wilson 在这个答案中提出的观点。但是,我担心性能,因为每次创建ObjectGraph
时都会构建。Activity
有什么想法吗?