You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 17:20:27