Android 多次注入作用域对象的同一实例

Android 多次注入作用域对象的同一实例,android,android-adapter,dagger-2,android-mvp,Android,Android Adapter,Dagger 2,Android Mvp,我有一个活动和它的演示者,两者都被注入了适配器。活动需要在RecyclerView上设置适配器,演示者需要它在数据更改时调用更新方法(例如:notifyItemChanged) 问题在于,由于适配器被注入了两次,演示者和活动没有相同的实例。我只需要Dagger来创建它的一个实例。但是,适配器需要活动的上下文,并且具有防止内存泄漏的@ActivityScope,这意味着我不能在其上使用@Singleton作用域 有什么我不明白的吗?是否有一种方法可以在两个类中插入适配器,而不必在演示者或活动中使用

我有一个活动和它的演示者,两者都被注入了适配器。活动需要在RecyclerView上设置适配器,演示者需要它在数据更改时调用更新方法(例如:
notifyItemChanged

问题在于,由于适配器被注入了两次,演示者和活动没有相同的实例。我只需要Dagger来创建它的一个实例。但是,适配器需要活动的上下文,并且具有防止内存泄漏的
@ActivityScope
,这意味着我不能在其上使用
@Singleton
作用域

有什么我不明白的吗?是否有一种方法可以在两个类中插入适配器,而不必在演示者或活动中使用
setAdapter
方法手动设置适配器?或者有没有办法限制创建的适配器实例的数量

编辑:依赖项注入文件:

@Module
public interface MainModule {

    @ActivityContext @Binds
    Context context(MainActivity activity);

    @ActivityScope @Binds
    MainContract.Presenter presenter(MainPresenter presenter);

    // CHILD FRAGMENT
    @FragmentScope @ContributesAndroidInjector
    ChildFragment childFragment();

    @ActivityScope @Binds
    ChildContract.Presenter childPresenter(ChildPresenter presenter);

    @ActivityScope @Binds
    ChildContract.AdapterView adapterView(MyAdapter adapter);

}
ChildFragment
ChildPresenter
MyAdapter
类用
@ActivityScope
注释


这是我让它工作的唯一方法,对我来说似乎是错误的,因为ChildPresenter和MyAdapter仅从片段中使用。但是,用
@FragmentScope
注释它们时会出现错误:“不能引用具有不同作用域的绑定”。此外,片段“提供者”和片段本身使用两个不同的作用域进行注释?

MVP体系结构中,演示者应只关注业务逻辑。这意味着,演示者不知道任何关于Android的东西,也不包含任何特定于Android的项目

在您的案例中,您写道您的演示者持有一个适配器,并在其上调用
notifyItemChanged
方法。这是一个特定于Android的项目,不应该以这种方式工作。视图负责持有适配器,从演示者适配器的任何交互都应通过视图进行

这对于您的示例意味着什么:

  • 视图创建并保存一个适配器
  • 视图界面提供(以及活动实现)调用
    notifyAdapterItemChanged
  • 当演示者需要告诉适配器数据已更新时,它调用视图notifyAdapterItemChanged(而视图又调用适配器
旁注:如果您需要以另一种方式(从适配器到演示者)提供数据,我建议向演示者添加一个特殊的adapterInterface,您可以将其作为弱引用保留在适配器中


希望这有帮助,如果您有任何其他问题,请告诉我…

使用
@ActivityScope
有什么问题吗?没什么,但我不能将此范围和
@Singleton
限制为一个实例。为什么您需要将其限制为一个实例?演示者、适配器和活动都应位于
@ActivityScope
—问题解决了。如果您想保存某些状态,可以创建一些
@Singleton Repository
或保存数据等的某物,它们都已在
@ActivityScope
中。我的适配器不保存状态,我的演示者保存状态。因为演示者提供数据并更新适配器,所以它必须是更新和显示的同一实例,这就是为什么我只需要一个实例。我相信您对范围的印象是错误的。作用域对象在其作用域中只存在一次。如果所有内容都是活动范围,则每个活动只有一个。我没有明确提到它,但我的适配器使用
notifyXX
等方法实现了我的
AdapterView
接口,因此演示者没有安卓项目。适配器通过回调向演示者提供数据。但我会试试你的方法。我确实需要用另一种方法传递数据,但为什么要用WeakReference呢?我在演示者绑定时设置回调,然后在其未绑定时将其删除,可以吗?可以,也可以。我更喜欢在通过接口访问演示者时使用weakReferences,因为它不会阻止GC。但你的方法肯定也会奏效。。。