8

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

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

我能够进行注射,但所有领域Activitynull在注射时

这是我进行注射的方式:

MyActivity本身就是一个模块。

@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.

我该怎么做呢?


编辑1:

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

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

Activity的不再是匕首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 在这个答案中提出的观点。但是,我担心性能,因为每次创建ObjectGraph时都会构建。Activity

有什么想法吗?

4

1 回答 1

19

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

在 Square,我们一直在使用Otto在活动及其后端之间进行通信,并且效果很好。有关示例,请参阅 Eric Burke 的示例代码项目

于 2012-12-21T14:42:12.803 回答