知识就是力量,时间就是生命。这篇文章主要讲述Android Dagger2,Singleton交叉组件相关的知识,希望能为你提供帮助。
我遇到了Singleton与android的Dagger2库有问题。我的问题是我使用@Singleton但得到两个不同的对象= [
我有2个组件和2个模块:
DispatcherComponent,包含提供Dispatcher的DispatcherModule类。 Dispatcher需要StoreModule提供的实例UserStore。
@Singleton
@Component(modules={AppModule.class, StoreModule.class, DispatcherModule.class})
public interface DispatcherComponent {
void inject(SomeClass someClass);
}
DispatcherModule.class如下所示
@Module
public class DispatcherModule {
@Provides
@Singleton
public Dispatcher provideDispatcher(UserStore store) {
Log.d("DEBUG", "userStore : " + store.toString());
return new Dispatcher(store);
}
现在是StoreComponent.class
@Singleton
@Component(modules={AppModule.class, StoreModule.class})
public interface StoreComponent {
void inject(SomeOtherClass otherClass);
}
和StoreModule.class
@Module
public class StoreModule {
@Provides
@Singleton
public UserStore provideUserStore() {
return new UserStore();
}
现在当我试图注入UserStore我得到两个不同的对象= /
public class SomeOtherClass extends Acitivity {
@Inject UserStore mStore;
public void onCreate(Bundle savedInstance) {
StoreComponent comp = ((MyApp) getApplication).getStoreComponent();
comp.inject(this);
Log.d("DEBUG", "userStore2 :" + mStore.toString());
}
}public class SomeClass {
@Inject Dispatcher mDispatcher;
public SomeClass (Application application) {
((MyApp) application).getDispatcherComponent().inject(this);
}
最后,这就是我创建组件的方式:
public class MyApp extends Application {
public void onCreate() {
StoreModule store = new StoreModule();
StoreComponent storeComponent = DaggerStoreComponent.builder().appModule(new AppModule(this)).storeModule(storeModule).build();
DispatcherComponent disComp = DaggerDispatcherComponent.builder().appModule(new AppModule(this)).storeModule(storeModule).dispatcherModule(new DispatcherModule()).build();
}
现在,当我运行应用程序时,我得到2个不同的对象!有人能帮我吗 ?我应该怎么解决?我不想要一个神组件..
谢谢!
答案请注意,@ Singleton实际上并没有使对象成为单例,而只是使用
DoubleCheck
类来缓存由dagger生成的组件impl所持有的类。检查DaggerDispatcherComponent以获取更多详细信息。【Android Dagger2,Singleton交叉组件】对于这种情况,您可以更改StoreModule,如下所示:
@Module
public class StoreModule {
private UserStore mStore;
@Provides
@Singleton
public UserStore provideUserStore() {
return getStore();
}private UserStore getStore() {
//lazy initialized and make sure thread safe
if (null == mStore) {
@synchronized(StoreModule.class) {
if (null == mStore) {
mStore = new UserStore();
}
}
}
return mStore;
}
}
推荐阅读
- Android - Singleton Class仅在第二次刷新时更新
- 在构建Android库时,我可以使用什么模式来支持Activity中已配置的回调
- 为什么我无法在Application Insights上查看运行时错误()
- Intellij(Android studio)成员变量前缀
- 更改Salesforce App中的RingCentral行为
- 在Android中从Eclipse导出项目时出错
- 8种提高安全性的网络攻击模拟工具
- 网络安全的8个最佳实践
- 加密货币和网络安全–它们是敌人吗()