当前位置: 首页 > 知识库问答 >
问题:

Dagger 2活动上下文/应用上下文模块

赵英哲
2023-03-14
@Singleton
@dagger.Component(modules = {
    AppModule.class
})
public interface AppComponent {
        void inject(MyApp application);
        Model model();
        Context context();<--- should provide the application Context for the Object above (model)
...

实现如下所示

@dagger.Module
public class AppModule {

    private final Application app;
    public ApplModule(Application app) {
        this.app = app;
    }

    @Provides
    @Singleton
    Model provideModel(Bus bus) {
        return new Model(bus);
    }

    @Provides
    @Singleton
    Context provideApplicationContext() {
        return app.getApplicationContext();
    }
...

>

  • 其次,我有一个活动范围组件网,我提供了当前活动和需要上下文的不同视图。

      @ActivityScope
        @Component(
                dependencies = AppComponent.class
                , modules = {ActivityModule.class}
        )
        public interface ActivityComponent {
            void inject(MyActivity activity);
            Context context(); <---should provide the activity's context
            MyView homeView(); <----takes a Context as a contructor parameter
    

    @module public class ActivityModule{private

    public ActivityModule(Activity activity) {
    
        this.activity = activity;
    }
    
    @Provides
    @ActivityScope
    public Activity activity() {
        return activity;
    }
    
    
    @Provides
    @ActivityScope
    @Named("viewcontext") <----- if I removed this I get an error from Dagger
    public Context context() {
        return activity;
    }
    
    @Provides
    @ActivityScope
    MyView provideZeView(Bus bus, Model model) { <---- previously receiving the ApplicationContext as a parameter 
        MyView v = new MyView(activity, bus, model); <---- must pass the activity otherwise passing the Context reveived is the ApplicationContext
        return v;
    }
    
  • 共有1个答案

    程磊
    2023-03-14

    可以使用这样的限定符。在两个独立的文件中定义以下内容:

    @Qualifier
    @Retention(RetentionPolicy.RUNTIME)
    public @interface ActivityContext {
    }
    
    @Qualifier
    @Retention(RetentionPolicy.RUNTIME)
    public @interface ApplicationContext {
    }
    

    然后在您的ActivityModule中执行以下操作:

    @Provides
    @ActivityScope
    @ActivityContext
    public Context context() {
        return activity;
    }
    

    同样地,在appmodule中执行以下操作:

     @Provides
        @Singleton
    @ApplicationContext
        Context provideApplicationContext() {
            return app.getApplicationContext();
        }
    

    例如,在您的活动中,您可以这样做:

      @Inject @ApplicationContext
        Context c;
    

    它将注入应用程序上下文。

    在一个模块中,您可以这样做,例如:

      @Provides
        @ActivityScope
        LoginPresenter provideLoginPresenter(@ActivityContext Context context) {
            return new LoginPresenter(context);
        }
    
     类似资料:
    • 问题内容: 关于这两个上下文的内容,已经有很多文章了。但是我仍然不太正确。 到目前为止,据我了解:每个实例都是其类的一个实例,这意味着某些程序员建议您尽可能频繁地使用它,以免“泄漏”任何内存。这是因为另一个this(获取Activity实例上下文)指向的Activity是每次用户倾斜手机或离开应用程序等时都将销毁的一个。显然,垃圾收集器(GC)无法捕获,因此使用了过多的内存。 .. 但是任何人都可

    • 0.9 新版功能. Flask 背后的设计理念之一就是,代码在执行时会处于两种不同的“状态”(states)。 当 Flask 对象被实例化后在模块层次上应用便开始隐式地处于应用配置状 态。一直到第一个请求还是到达这种状态才隐式地结束。当应用处于这个状态的时候 ,你可以认为下面的假设是成立的: 程序员可以安全地修改应用对象 目前还没有处理任何请求 你必须得有一个指向应用对象的引用来修改它。不会有某

    • 我多年来一直在使用Spring MVC,我试图理解与Spring Boot的一些关键区别。 你能帮我确认一下吗?或者让我明白我在这里遗漏了什么?

    • 我想使用下面另一个活动简单代码示例中的活动上下文,有什么想法吗? 谢谢

    • 我试图并行处理Spring批处理作业中的一些步骤。作业的XML配置如下:

    • Spring Boot对于如何使用Spring构建应用程序有一个看法:例如它具有常规配置文件的常规位置,以及用于常见管理和监视任务的端点。Spring Cloud建立在此之上,并添加了一些可能系统中所有组件将使用或偶尔需要的功能。 引导应用程序上下文 一个Spring Cloud应用程序通过创建一个“引导”上下文来进行操作,这个上下文是主应用程序的父上下文。开箱即用,负责从外部源加载配置属性,还解