2017-07-07 46 views
0

以下代码创建&股喷射的依赖(ViewsApiEnd)具有不同活性的相同对象,而不是创建每个活动不同。dagger2 activityscope提供注入依赖性相同的对象具有不同活性

@ActivityScope 
@Component(dependencies = HttpComponent.class, modules = ViewsApiModule.class) 
public interface ViewsApiComponent { 
    void inject(MainActivity activity); 

    void inject(SecondActivity activity2); 
} 

模块:

@Module 
public class ViewsApiModule { 

    @Provides 
    @ActivityScope 
    public ViewsApiEnd providesGitHubInterface(Retrofit retrofit) { 
     return retrofit.create(ViewsApiEnd.class); 
    } 
} 

范围:

@Scope 
    @Retention(RetentionPolicy.RUNTIME) 
    public @interface ActivityScope{ 
    } 

全部来源:Github(如果任何人都可以用叉子叉&正确范围issue这将是有帮助的也checke void logInstances()验证对象。创作)

如果我想让dagger2为不同的活动(MainActivity,SecondActivity)创建不同的注入的对象(ViewsApiEnd),我该如何声明ViewsApiComponent

回答

1

我假设你的意思是不同的实例,而不是不同的实现。

这个关键是范围和你如何管理你的组件。特别是ViewsApiComponent

让我们从作用域开始。匕首中的作用域只不过是一个注释,它告诉匕首在给定组件的生命周期内,只要需要使用给定作用域注释的对象,提供的实例将始终是相同的。换句话说,在相同的组件范围内,依赖关系将是单例。

在你的代码中,这个ActivityScope是连接到ViewsApiEnd的范围。现在人们通常不会了解范围是第一部分 - “......只要组件是活着的,范围内的依赖关系就是单例”。基本上这就是说,如果你的组件的实例保持不变,那么你所有的作用域实例将是相同的。

在您的代码中,这种情况是因为您将mViewsApiComponent锁定到应用程序类,并且您从不重新创建它。因此,在您的活动,当你做到这一点:

// ... 
((MyApp) getApplication()).getGitHubComponent().inject(this); 
// ... 

你总是使用相同的组件,因此相同的范围,因此相同的ViewsApiEnd实例。

您需要确保作用域依赖项具有适当的作用域处理。如果您希望每个活动的依赖性不同,那么您需要管理在每个活动的基础上处理这个依赖关系的组件。

有这样做的不同方式。我认为你案例中最简单的一个是将ViewsApiComponent的创建移动到你的活动中。确保您取消了onDestroy中的组件。事情是这样的:

private ViewsApiComponent mViewsApiComponent; 

@Override 
public void onCreate() { 
    super.onCreate(); 

    getComponent().inject(this); 
} 

@Overrides 
public void onDestroy() { 
    super.onDestroy(); 
    mViewsApiComponent = null; 
} 

private ViewsApiComponent getComponent() { 
    if (mViewsApiComponent == null) { 
     mViewsApiComponent = DaggerViewsApiComponent.builder() 
      .httpComponent(((MyApp) getApplication()).getNetComponent()) 
      .build(); 
    } 
    return mViewsApiComponent; 
} 

你甚至可以把一个基地活动验证码,并继承了它的每一项活动。

注意到重要的是,该组件现在由活动管理,或最好把它绑在它的生命周期。这可以确保组件在活动的生命周期内一直存在,并且所有范围内的依赖关系在该活动中都是相同的。对于另一活性的新组件将被创建并在新对象实例将被使用,但在活动范围内,他们将保持不变。

现在我已经解释了所有这些只是为了试图帮助您解决组件和范围问题,但事实是,您当前在组件模块中提供的是所有对象,它们确实应该是单例应用程序的生活。所以实际上,你现在的方式至少在我看来是最正确的方法。

希望这有助于

+0

感谢您的帮助,但我觉得'@Overrides 公共无效的onDestroy(){ super.onDestroy(); mViewsApiComponent = NULL; }'是后备选项。 – AskQ

+0

你是什么意思?你为什么这样想? – Fred

+0

它解决了问题,所以我upvoted ..但让我得到这个问题我张贴在dagger2 GitHub上的响应。 – AskQ

相关问题