2017-07-07 44 views
0

以下代碼創建&股噴射的依賴(ViewsApiEnd)具有不同活性的相同對象,而不是創建每個活動不同。dagger2 activityscope提供注入依賴性相同的對象具有不同活性

@ActivityScope 
@Component(dependencies = HttpComponent.class, modules = ViewsApiModule.class) 
public interface ViewsApiComponent { 
    void inject(MainActivity activity); 

    void inject(SecondActivity activity2); 
} 

模塊:

@Module 
public class ViewsApiModule { 

    @Provides 
    @ActivityScope 
    public ViewsApiEnd providesGitHubInterface(Retrofit retrofit) { 
     return retrofit.create(ViewsApiEnd.class); 
    } 
} 

範圍:

@Scope 
    @Retention(RetentionPolicy.RUNTIME) 
    public @interface ActivityScope{ 
    } 

全部來源:Github(如果任何人都可以用叉子叉&正確範圍issue這將是有幫助的也checke void logInstances()驗證對象。創作)

如果我想讓dagger2爲不同的活動(MainActivity,SecondActivity)創建不同的注入的對象(ViewsApiEnd),我該如何聲明ViewsApiComponent

回答

1

我假設你的意思是不同的實例,而不是不同的實現。

這個關鍵是範圍和你如何管理你的組件。特別是ViewsApiComponent

讓我們從作用域開始。匕首中的作用域只不過是一個註釋,它告訴匕首在給定組件的生命週期內,只要需要使用給定作用域註釋的對象,提供的實例將始終是相同的。換句話說,在相同的組件範圍內,依賴關係將是單例。

在你的代碼中,這個ActivityScope是連接到ViewsApiEnd的範圍。現在人們通常不會了解範圍是第一部分 - 「......只要組件是活着的,範圍內的依賴關係就是單例」。基本上這就是說,如果你的組件的實例保持不變,那麼你所有的作用域實例將是相同的。

在您的代碼中,這種情況是因爲您將mViewsApiComponent鎖定到應用程序類,並且您從不重新創建它。因此,在您的活動,當你做到這一點:

// ... 
((MyApp) getApplication()).getGitHubComponent().inject(this); 
// ... 

你總是使用相同的組件,因此相同的範圍,因此相同的ViewsApiEnd實例。

您需要確保作用域依賴項具有適當的作用域處理。如果您希望每個活動的依賴性不同,那麼您需要管理在每個活動的基礎上處理這個依賴關係的組件。

有這樣做的不同方式。我認爲你案例中最簡單的一個是將ViewsApiComponent的創建移動到你的活動中。確保您取消了onDestroy中的組件。事情是這樣的:

private ViewsApiComponent mViewsApiComponent; 

@Override 
public void onCreate() { 
    super.onCreate(); 

    getComponent().inject(this); 
} 

@Overrides 
public void onDestroy() { 
    super.onDestroy(); 
    mViewsApiComponent = null; 
} 

private ViewsApiComponent getComponent() { 
    if (mViewsApiComponent == null) { 
     mViewsApiComponent = DaggerViewsApiComponent.builder() 
      .httpComponent(((MyApp) getApplication()).getNetComponent()) 
      .build(); 
    } 
    return mViewsApiComponent; 
} 

你甚至可以把一個基地活動驗證碼,並繼承了它的每一項活動。

注意到重要的是,該組件現在由活動管理,或最好把它綁在它的生命週期。這可以確保組件在活動的生命週期內一直存在,並且所有範圍內的依賴關係在該活動中都是相同的。對於另一活性的新組件將被創建並在新對象實例將被使用,但在活動範圍內,他們將保持不變。

現在我已經解釋了所有這些只是爲了試圖幫助您解決組件和範圍問題,但事實是,您當前在組件模塊中提供的是所有對象,它們確實應該是單例應用程序的生活。所以實際上,你現在的方式至少在我看來是最正確的方法。

希望這有助於

+0

感謝您的幫助,但我覺得'@Overrides 公共無效的onDestroy(){ super.onDestroy(); mViewsApiComponent = NULL; }'是後備選項。 – AskQ

+0

你是什麼意思?你爲什麼這樣想? – Fred

+0

它解決了問題,所以我upvoted ..但讓我得到這個問題我張貼在dagger2 GitHub上的響應。 – AskQ

相關問題