2017-12-27 26 views
0

Ich habe ein Problem mit Singleton mit der Dagger2-Bibliothek für Android. Mein Problem ist, im die @Singleton aber immer zwei verschiedene Objekte = [Android Dagger2, Singleton Kreuz Komponente

Ich habe 2-Komponenten und 2 Module mit:

DispatcherComponent die die DispatcherModule Klasse umfasst, die einen Dispatcher zur Verfügung stellt. Der Dispatcher benötigt die Instanz UserStore, die von StoreModule bereitgestellt wird.

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

und die DispatcherModule.class ist als

@Module 
public class DispatcherModule { 
    @Provides 
    @Singleton 
    public Dispatcher provideDispatcher(UserStore store) { 
     Log.d("DEBUG", "userStore : " + store.toString()); 
     return new Dispatcher(store); 
    } 

folgt und jetzt die StoreComponent.class

@Singleton 
@Component(modules={AppModule.class, StoreModule.class}) 
public interface StoreComponent { 
    void inject(SomeOtherClass otherClass); 
} 

und StoreModule.class

@Module 
public class StoreModule { 
    @Provides 
    @Singleton 
    public UserStore provideUserStore() { 
     return new UserStore(); 
    } 

jetzt, wenn im Versuch, um UserSto zu injizieren Re_Im zwei verschiedene Objekte bekommen =/

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

und letzte, das ist, wie ich die Komponenten erstellen:

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

jetzt, wenn im die Anwendung läuft, bekomme ich zwei verschiedene Objekte! kann mir jemand helfen ? Wie sollte ich es beheben? ich will nicht eine Gottkomponente haben.

THanks!

Antwort

0

Beachten Sie, dass @Singleton das Objekt eigentlich nicht zu Singleton macht, stattdessen verwendet es einfach die Klasse DoubleCheck, um zu cachen, die von der durch Dolch erzeugten Komponente impl gehalten wird. Überprüfen Sie DaggerDispatcherComponent für weitere Details.

@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

Danke:

Für diesen Fall können Sie StoreModule wie unten ändern! es funktioniert jetzt :) also nur um klar zu sein, Singleton ist nur echte Singleton wenn ich die gleiche Komponente richtig benutze? – user3534500

+0

Nicht der echte Singleton (sagte, dass es keine statische Instanz ist), nur das Mitglied der Komponenteninstanz, sobald die Komponente von GC freigegeben wird, wird auch der Speicher freigegeben, weil der userStore tatsächlich von der Komponente gehalten wird. – luffy

Verwandte Themen