2017-12-27 27 views
0

Android用Dagger2ライブラリでSingletonに問題があります。ディスパッチャを提供DispatcherModuleクラスが含まれてAndroid Dagger2、Singleton crossコンポーネント

DispatcherComponent: 私の問題は、私は2つのコンポーネントと2つのモジュールがイム@Singletonを使用しますが= 2つの異なるオブジェクトを取得[

です。 DispatcherはStoreModuleによって提供されるインスタンスUserStoreを必要とします。

@Singleton 
@Component(modules={AppModule.class, StoreModule.class, DispatcherModule.class}) 
public interface DispatcherComponent { 
    void inject(SomeClass someClass); 
} 

@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(); 
    } 

イムしようとして次のようにDispatcherModule.classがありますUserStoを挿入するイム再2つの異なるオブジェクト=/

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つの異なるオブジェクトを取得します!誰かが私を助けることができる?どのように私はそれを修正すべきですか?私は神の構成要素を持っていたいとは思っていません。

THanks!

答えて

0

@ Singletonはオブジェクトを実際にシングルトンにするのではなく、ダガーによって生成されたコンポーネントimplによって保持されているキャッシュに、DoubleCheckクラスを使用することに注意してください。詳細については、DaggerDispatcherComponentを確認してください。この場合の

、あなたは以下のような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; 
    } 
} 
+0

感謝を!それは今働いています:)そのため、ちょうど明確にするために、同じコンポーネントを使用している場合、シングルトンは本当のシングルトンですか? – user3534500

+0

実際のシングルトン(静的インスタンスではない)、コンポーネントインスタンスのメンバーだけでなく、コンポーネントがGCによって解放されると、ストアも解放され、userStoreが実際にコンポーネントによって保持されるためです。 – luffy

関連する問題