Android的匕首:调用setContentView之后,将一个Activity注入到对象图中

我想在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

以下是我如何进行注射:

我的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

我怎么去做这个?


编辑1:

我是这样做的 – 但是我不确定这是否是“正确的方式”。 我做的是

  1. 将Activity传递给Module构造函数
  2. 确保执行setContentView() 之后构buildObjectGraph 以便将适当的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); } } 

这个解决scheme似乎解决了Jesse Wilson在这个答案中提出的观点。 但是,我担心的是性能,因为每次创buildActivity ObjectGraph都将被构build。

有什么想法吗?

Solutions Collecting From Web of "Android的匕首:调用setContentView之后,将一个Activity注入到对象图中"

不幸的是,这可能不适用于Dagger,或者大多数其他dependency injection框架。 问题在于Activity的生命周期并不完全与PresentationLayer的生命周期PresentationLayer 。 例如,当您旋转屏幕时,Android会破坏该活动并在其位置创build另一个活动。 PresentationLayer无法参与其中。

在Square,我们一直在使用Otto在活动和后端之间进行沟通,并且运作良好。 请参阅Eric Burke的示例代码项目 。