Dagger2技术疑问:如何向ActivityModule正确传入MainActivity实例?
问题
我有一个包含ApplicationModule和ActivityModule的Application组件,在MvpApp.java中创建组件的代码如下:
public class MvpApp extends Application { @Override public void onCreate() { super.onCreate(); mApplicationComponent = DaggerApplicationComponent.builder() .activityModule(new ActivityModule()) .applicationModule(new ApplicationModule(this)) .build(); } }
我的ApplicationModule有接收Application的构造函数,且已正确传入实例;但ActivityModule的构造函数如下:
public ActivityModule(AppCompatActivity activity) { this.mActivity = activity; }
我尝试直接new MainActivity()传入构造函数时出现错误,想知道该如何正确传入MainActivity实例?
解决方案
你不能在Application的onCreate方法里直接new MainActivity()来创建Activity实例——Android的Activity实例必须由系统框架创建,手动new出来的实例不具备完整的生命周期和上下文环境,这就是你报错的原因。正确的做法是拆分组件层级:
- 拆分组件结构:将
ApplicationComponent和ActivityComponent分开,让ActivityComponent依赖ApplicationComponent,ActivityModule仅在对应Activity内部初始化。 - 修改Application组件初始化逻辑:移除
ActivityModule的初始化,只保留全局的ApplicationModule:public class MvpApp extends Application { private ApplicationComponent mApplicationComponent; @Override public void onCreate() { super.onCreate(); mApplicationComponent = DaggerApplicationComponent.builder() .applicationModule(new ApplicationModule(this)) .build(); } public ApplicationComponent getApplicationComponent() { return mApplicationComponent; } } - 定义ActivityComponent并关联依赖:
@Component(dependencies = ApplicationComponent.class, modules = ActivityModule.class) public interface ActivityComponent { void inject(MainActivity activity); } - 在MainActivity中初始化ActivityComponent:在Activity的生命周期方法里,传入自身实例到
ActivityModule:public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ActivityComponent activityComponent = DaggerActivityComponent.builder() .applicationComponent(((MvpApp) getApplication()).getApplicationComponent()) .activityModule(new ActivityModule(this)) .build(); activityComponent.inject(this); } }
这么做的核心原因是:Application是全局单例,生命周期贯穿整个App;而Activity有独立的生命周期,随页面创建销毁。将Activity相关的依赖放在对应Activity内部初始化,既能保证依赖实例与Activity生命周期同步,也符合Android组件的生命周期管理规则,避免出现上下文缺失、内存泄漏等问题。
内容的提问来源于stack exchange,提问作者Sunbey13
相关产品推荐
相关产品推荐

