我有一个定制的匕首瞄准镜。
@Scope
@Retention(RetentionPolicy.RUNTIME)
public @interface FeatureScope {
}
Run Code Online (Sandbox Code Playgroud)
我有一个组件/模块,它提供与此范围相关的演示器(任何 UI 元素都可以在这里真正工作)。
@FeatureScope
@Component(modules = {
CustomScopedModule.class
})
public interface CustomScopedComponent {
}
Run Code Online (Sandbox Code Playgroud)
@Module
public class CustomScopedModule {
@FeatureScope
@Provides
Presenter providePresenter() {
return new Presenter();
}
}
Run Code Online (Sandbox Code Playgroud)
我知道当不再需要这个自定义范围时,由我来创建/销毁它。所以在我的应用程序中我有:
public class MyApplication extends Application {
private CustomScopedComponent customScopedComponent;
public CustomScopedComponent getCustomScopedComponent() {
if (customScopedComponent == null) {
customScopedComponent = DaggerCustomScopedComponent.builder()
.contactsModule(new CustomScopedModule())
.build();
}
return customScopedComponent;
}
public void finishedWithCustomScopedComponent() {
customScopedComponent = null;
}
Run Code Online (Sandbox Code Playgroud)
但是,我现在需要在将组件(和演示者)超出范围后进行“清理”。我不能只将 customScopedComponent 设置为 null。我还需要在我的上调用 cleanup() Presenter:
class Presenter {
public void cleanup() {
// Dispose of all the things
// Release any DB connections
}
...
}
Run Code Online (Sandbox Code Playgroud)
处理/创建调用路径来处理此问题的最佳方法是什么?我发现 Dagger 确实没有任何工具可以实现此目的,我需要推出自己的解决方案
所以我想至少我可以向模块添加一个方法:
@Module
public class CustomScopedModule {
@FeatureScope
@Provides
Presenter providePresenter() {
return new Presenter();
}
public void cleanup() {
// call Presenter.cleanup();
}
}
Run Code Online (Sandbox Code Playgroud)
并在销毁组件时调用它:
public class MyApplication extends Application {
private CustomScopedComponent customScopedComponent;
private CustomScopedModule customScopedModule;
...
public void finishedWithCustomScopedComponent() {
customScopedModule.cleanup();
customScopedComponent = null;
}
}
Run Code Online (Sandbox Code Playgroud)
但我的问题是,模块的方法如何cleanup()访问演示者?我唯一能想到的就是将演示者保存为模块内的一个字段:
@Module
public class CustomScopedModule {
private Presenter presenter;
@FeatureScope
@Provides
Presenter providePresenter() {
presenter = new Presenter(); // save instance to cleanup later
return presenter;
}
public void cleanup() {
if (presenter != null) {
presenter.cleanup();
}
}
}
Run Code Online (Sandbox Code Playgroud)
对我来说,这看起来很丑陋,而且非常不符合 Dagger 风格。
| 归档时间: |
|
| 查看次数: |
245 次 |
| 最近记录: |