Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/375.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Dagger for Android:调用setContentView后将活动注入对象图_Java_Android_Dependency Injection_Dagger - Fatal编程技术网

Java Dagger for Android:调用setContentView后将活动注入对象图

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){ (

我想在Android上使用Dagger将
活动的一个实例注入另一个类,如下所示:

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()
    等)自己构造对象;或者在需要的地方使用工厂来获取依赖项的实例。这并不理想,但我认为在我的用例中这是一个可以接受的折衷方案。