多次注入作用域对象的同一个实例
Inject the same instance of a scoped object multiple times
我有一个 Activity 和它的展示器,都被注入了适配器。 Activity 需要在 RecyclerView 上设置适配器,当数据更改时,presenter 需要它调用更新方法(例如:notifyItemChanged
)。
问题是因为适配器被注入了两次,presenter 和 activity 没有相同的实例。我需要 Dagger 来创建它的一个实例。但是,适配器需要 Activity 的上下文并且具有 @ActivityScope
来防止内存泄漏,这意味着我不能在其上也使用 @Singleton
范围。
有什么不明白的吗?有没有一种方法可以在 类 中注入适配器,而无需在演示者或 Activity 中使用 setAdapter
方法手动设置?或者有没有办法限制 Adapter 创建的实例数?
编辑:依赖注入文件:
@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
注释它们会引发错误:"may not reference bindings with different scopes"。此外,片段 "provider" 和片段本身用两个不同的范围进行注释?
在 MVP 架构中,presenter 应该只关心业务逻辑。这意味着 presenter 对 Android 的东西一无所知,也不包含任何 Android 特定项目。
在您的情况下,您写道您的 presenter 拥有一个 adapter 并在其上调用 notifyItemChanged
方法。这是一个 Android 特定项目,不应该那样工作。 view 负责保存 adapter 以及从 presenter 到 适配器应该通过视图发生。
这对您的示例意味着什么:
- view 创建并保存一个 adapter
- 视图界面提供(并且activity实现)调用
notifyAdapterItemChanged
- 当 presenter 需要告诉 adapter 数据已更新时,它会调用 view
notifyAdapterItemChanged
(并且 view 依次调用 adapter)
旁注:如果您需要以相反的方式提供数据(从适配器到演示者),我建议向演示者添加一个特殊的适配器接口,您可以将其作为弱引用保留在适配器。
希望对您有所帮助,如果您还有其他问题,请告诉我...
我有一个 Activity 和它的展示器,都被注入了适配器。 Activity 需要在 RecyclerView 上设置适配器,当数据更改时,presenter 需要它调用更新方法(例如:notifyItemChanged
)。
问题是因为适配器被注入了两次,presenter 和 activity 没有相同的实例。我需要 Dagger 来创建它的一个实例。但是,适配器需要 Activity 的上下文并且具有 @ActivityScope
来防止内存泄漏,这意味着我不能在其上也使用 @Singleton
范围。
有什么不明白的吗?有没有一种方法可以在 类 中注入适配器,而无需在演示者或 Activity 中使用 setAdapter
方法手动设置?或者有没有办法限制 Adapter 创建的实例数?
编辑:依赖注入文件:
@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
注释它们会引发错误:"may not reference bindings with different scopes"。此外,片段 "provider" 和片段本身用两个不同的范围进行注释?
在 MVP 架构中,presenter 应该只关心业务逻辑。这意味着 presenter 对 Android 的东西一无所知,也不包含任何 Android 特定项目。
在您的情况下,您写道您的 presenter 拥有一个 adapter 并在其上调用 notifyItemChanged
方法。这是一个 Android 特定项目,不应该那样工作。 view 负责保存 adapter 以及从 presenter 到 适配器应该通过视图发生。
这对您的示例意味着什么:
- view 创建并保存一个 adapter
- 视图界面提供(并且activity实现)调用
notifyAdapterItemChanged
- 当 presenter 需要告诉 adapter 数据已更新时,它会调用 view
notifyAdapterItemChanged
(并且 view 依次调用 adapter)
旁注:如果您需要以相反的方式提供数据(从适配器到演示者),我建议向演示者添加一个特殊的适配器接口,您可以将其作为弱引用保留在适配器。
希望对您有所帮助,如果您还有其他问题,请告诉我...