我想在 Android 上使用 Dagger 将 Activity 的实例注入(inject)到另一个类中,如下所示:
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());
//...
//...
}
}
我能够进行注入(inject),但是 Activity 的所有字段在注入(inject)时都是 null。
这是我进行注入(inject)的方式:
我的 Activity 本身就是一个模块。
@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 后显式执行注入(inject)的方法。
我该怎么做?
我让它像这样工作 - 但是我不确定这是否是“正确的方式”。我做的是
Module 构造函数setContentView() 之后构建 ObjectGraph 以便正确的 Activity 实例是传递给 ObjectGraph。我的 Activity 不再是 Dagger 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 在 this answer 中提出的要点.但是,我担心性能问题,因为 ObjectGraph 将在每次创建 Activity 时构建。
有什么想法吗?
最佳答案
不幸的是,这可能不适用于 Dagger 或大多数其他依赖注入(inject)框架。问题在于 Activity 的生命周期与 PresentationLayer 的生命周期不完全一致。例如,当您旋转屏幕时,Android 将销毁 Activity 并在其位置创建另一个 Activity。 PresentationLayer 没有钩子(Hook)参与其中。
在 Square,我们一直在使用 Otto在 Activity 及其后端之间进行通信,并且效果很好。参见 Eric Burke 的 sample code project举个例子。
关于java - 适用于 Android 的 Dagger : Injecting an Activity to the object graph after calling setContentView,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13986092/