簡體   English   中英

Android Dagger2,Singleton交叉組件

[英]Android Dagger2, Singleton cross Component

我在Android Dagger2庫中遇到Singleton問題。 我的問題是即時通訊使用@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。

在這種情況下,您可以如下更改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;
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM