草庐IT

java - 适用于 Android 的 Dagger : Injecting an Activity to the object graph after calling setContentView

coder 2023-11-23 原文

我想在 Android 上使用 Dagger 将 Activity 的实例注入(inject)到另一个类中,如下所示:

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());
        //...
        //...
    }
}

我能够进行注入(inject),但是 Activity 的所有字段在注入(inject)时都是 null

这是我进行注入(inject)的方式:

我的 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 后显式执行注入(inject)的方法。

我该怎么做?


编辑 1:

我让它像这样工作 - 但是我不确定这是否是“正确的方式”。我做的是

  1. 将 Activity 传递给 Module 构造函数
  2. 确保在执行 setContentView() 之后构建 ObjectGraph 以便正确的 Activity 实例是传递给 ObjectGraph

我的 Activity 不再是 Dagger 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);
    }
}

此解决方案似乎解决了 Jesse Wilson 在 this answer 中提出的要点.但是,我担心性能问题,因为 ObjectGraph 将在每次创建 Activity 时构建

有什么想法吗?

最佳答案

不幸的是,这可能不适用于 Dagger 或大多数其他依赖注入(inject)框架。问题在于 Activity 的生命周期与 PresentationLayer 的生命周期不完全一致。例如,当您旋转屏幕时,Android 将销毁 Activity 并在其位置创建另一个 Activity。 PresentationLayer 没有钩子(Hook)参与其中。

在 Square,我们一直在使用 Otto在 Activity 及其后端之间进行通信,并且效果很好。参见 Eric Burke 的 sample code project举个例子。

关于java - 适用于 Android 的 Dagger : Injecting an Activity to the object graph after calling setContentView,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13986092/

有关java - 适用于 Android 的 Dagger : Injecting an Activity to the object graph after calling setContentView的更多相关文章

随机推荐