Android 多次注入作用域对象的同一实例
我有一个活动和它的演示者,两者都被注入了适配器。活动需要在RecyclerView上设置适配器,演示者需要它在数据更改时调用更新方法(例如:Android 多次注入作用域对象的同一实例,android,android-adapter,dagger-2,android-mvp,Android,Android Adapter,Dagger 2,Android Mvp,我有一个活动和它的演示者,两者都被注入了适配器。活动需要在RecyclerView上设置适配器,演示者需要它在数据更改时调用更新方法(例如:notifyItemChanged) 问题在于,由于适配器被注入了两次,演示者和活动没有相同的实例。我只需要Dagger来创建它的一个实例。但是,适配器需要活动的上下文,并且具有防止内存泄漏的@ActivityScope,这意味着我不能在其上使用@Singleton作用域 有什么我不明白的吗?是否有一种方法可以在两个类中插入适配器,而不必在演示者或活动中使用
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
- 当演示者
希望这有帮助,如果您有任何其他问题,请告诉我…使用
@ActivityScope
有什么问题吗?没什么,但我不能将此范围和@Singleton
限制为一个实例。为什么您需要将其限制为一个实例?演示者、适配器和活动都应位于@ActivityScope
—问题解决了。如果您想保存某些状态,可以创建一些@Singleton Repository
或保存数据等的某物,它们都已在@ActivityScope
中。我的适配器不保存状态,我的演示者保存状态。因为演示者提供数据并更新适配器,所以它必须是更新和显示的同一实例,这就是为什么我只需要一个实例。我相信您对范围的印象是错误的。作用域对象在其作用域中只存在一次。如果所有内容都是活动范围,则每个活动只有一个。我没有明确提到它,但我的适配器使用notifyXX
等方法实现了我的AdapterView
接口,因此演示者没有安卓项目。适配器通过回调向演示者提供数据。但我会试试你的方法。我确实需要用另一种方法传递数据,但为什么要用WeakReference呢?我在演示者绑定时设置回调,然后在其未绑定时将其删除,可以吗?可以,也可以。我更喜欢在通过接口访问演示者时使用weakReferences,因为它不会阻止GC。但你的方法肯定也会奏效。。。