Java Dagger for Android:调用setContentView后将活动注入对象图
我想在Android上使用Dagger将Java Dagger for Android:调用setContentView后将活动注入对象图,java,android,dependency-injection,dagger,Java,Android,Dependency Injection,Dagger,我想在Android上使用Dagger将活动的一个实例注入另一个类,如下所示: class PresentationLayer{ Activity mActivity; @Inject public PresentationLayer(Activity activity){ this.mActivity = activity; } public void presentData(User user){ (
活动的一个实例注入另一个类,如下所示:
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());
//...
//...
}
}
我可以进行注入,但是在注入时,活动的所有字段都是空的
以下是我注射的方法:
我的活动
本身就是一个模块
@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);
}
}
以及引导对象图的应用程序
类
class CustomApplication extends Application{
private static ObjectGraph sObjectGraph;
@Override
public void onCreate(){
sObjectGraph = ObjectGraph.create(new DaggerModule());
}
static getObjectGraph(){
return sObjectGraph;
}
}
我正在寻找一种在调用setContentView
后显式执行注入的方法
我该怎么做呢
编辑1:
我让它像这样工作-但是我不确定这是否是“正确的方式”。我所做的是
将活动传递给模块
构造函数
确保在执行setContentView()
之后构建ObjectGraph
,以便将适当的活动
实例传递到ObjectGraph
我的活动
不再是匕首模块
这在代码中转换为以下内容:
@Module(
entryPoints = PresentationLayer.class
)
class DaggerModule{
private Activity mActivity;
public DaggerModule (Activity activity){
this.mActivity = activity;
}
@Provides PresentationLayer providePresentation(){
return new PresentationLayer(mActivity);
}
}
这就是我的活动的样子:
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在年提出的问题。但是,我担心性能,因为每次创建活动
时都将构建对象图
有什么想法吗?不幸的是,这可能不适用于Dagger或大多数其他依赖项注入框架。问题在于活动的生命周期
与PresentationLayer的生命周期不完全一致。例如,当你旋转屏幕时,Android会破坏活动并在其位置创建另一个活动。PresentationLayer
没有参与其中的钩子
在Square,我们一直使用它来在活动和它们的后端之间进行通信,而且效果很好。参见Eric Burke的例子。我明白了活动
生命周期的意义。我编辑了我的问题,以包括我认为可能的解决方案。我想听听你的想法。我的目标是在桌面Java应用程序和Android应用程序之间共享模块。因此,PresentationLayer
将是BusinessLogicLayer
的依赖项。在Android中,我将Dagger配置为注入PresentationLayer的Android实现,而在JSE中,我注入了不同的PreLayer impl(它不需要活动
,因为它只使用System.out.println
)。如果有帮助的话,我很乐意在github上上传一个示例项目。ObjectGraph创建很便宜,但您的单例可能不便宜。特别是如果它们是有状态的(比如Otto总线),在这种情况下,您不想创建多个对象图。使用ObjectGraph.plus(),您可以在现有图形的基础上进行构建。这可能有助于创建每个活动的图表。谢谢!根据您的评论,我倾向于在“容易”的地方使用Dagger,而在使用Dagger(或任何JSR330库)变得笨拙的地方使用“手动”DI。所谓手动DI,我指的是从我的引导类(如main
方法或Servlet
或onCreate()
等)自己构造对象;或者在需要的地方使用工厂来获取依赖项的实例。这并不理想,但我认为在我的用例中这是一个可以接受的折衷方案。