android - 多次注入同一个作用域对象实例
问题描述
我有一个 Activity 和它的演示者,都被注入了一个适配器。Activity 需要在 RecyclerView 上设置适配器,并且 Presenter 需要它notifyItemChanged
在数据更改时调用更新方法(例如:)。
问题是因为适配器被注入了两次,所以演示者和活动没有相同的实例。我需要 Dagger 来创建它的一个实例。但是,适配器需要 Activity 的上下文并且必须@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
(视图依次调用适配器)
旁注:如果您需要以相反的方式提供数据(从适配器到演示者),我建议向演示者添加一个特殊的适配器接口,您可以将其作为适配器中的弱引用保留。
希望对您有所帮助,如果您有任何其他问题,请告诉我...
推荐阅读
- python - Python:“in”运算符是否支持“*”通配符?
- php - PHP - 如何使用 RSA256 方法对数据进行编码?
- angular - Angular observable,如何遍历具有嵌套数组的对象以将字段收集到数组中
- javascript - 在现有主场景的一侧重叠相同场景
- javascript - 在Angular中将xlsx导出为csv
- maven - SonarQube - 使用参数配置拉取请求装饰
- google-bigquery - 禁用计划查询时出错:更新禁用属性时出错。请稍后再试
- pyspark - 使用 pyspark 比较镶木地板文件的元数据
- javascript - 添加 PointSeries 后如何更改 LightningChart 的 setPointFillStyle?
- vue.js - 如何在“挂载”VueJS 方法中使用 Jest 测试函数