簡體   English   中英

匕首2:是否建議對活動和片段使用靜態提供程序?

[英]Dagger 2: Is it recommended to use a static provider for Activities and fragments?

我最近觀看了Gregory Kick在Dagger 2上的演講 。他在那里解釋了有關靜態提供程序方法的信息,該方法可能有助於提高性能。 因此,我將項目中的所有提供程序方法都修改為static 但我對此表示懷疑。 在我的項目中,有些提供程序返回一個活動實例(一個外部依賴項)。 因此,我編寫了帶有構造函數的module ,該構造函數從外部獲取Activity

@Module
public class ActivityModule {
  private static BaseActivity mActivity;

  public ActivityModule(BaseActivity activity) {
    mActivity = activity;
  }

  @ActivityScope
  @Provides
  Activity mActivity() {
    return mActivity;
  }

  @ActivityScope
  @Provides
  BaseActivity baseActivity() {
    return mActivity;
  }
}

因此,如果我必須使提供程序成為靜態,它將看起來像以下內容

@Module
public class ActivityModule {
  private static BaseActivity mActivity;

  public ActivityModule(BaseActivity activity) {
    mActivity = activity;
  }

  @ActivityScoped
  @Provides
  static Activity mActivity() {
    return mActivity;
  }

  @ActivityScoped
  @Provides
  static BaseActivity baseActivity() {
    return mActivity;
  }
}

因此,這里將活動實例保留在static成員中。 會引起內存泄漏嗎? 還是只要活動被銷毀,dagger就會通過刪除靜態引用來自動管理它? 在這種情況下,建議保留靜態提供程序?

是否建議對活動和片段使用靜態提供程序?

。您要做的就是創建錯誤和內存泄漏的來源。 根據經驗,切勿將任何Android Framework類型放入靜態變量中。 他們引用context ,您將泄漏內存。

如前所述,靜態方法可能會提高性能,您當然可以使用它。 您顯示的代碼的問題是返回靜態變量的靜態方法,這也違反了調用模塊構造函數的目的。

如果您有一個僅由靜態方法組成的模塊,那么您可能會獲得一些額外的性能,並消除了對模塊實例分配的需求,正如鏈接講座中提到的那樣。

靜態方法本身還可以,但是它們不應與應用程序的其他部分交互,例如從靜態變量讀取或寫入靜態變量。 如果您對其他對象有依賴性,請始終將它們作為參數添加到provider-method中。 這樣Dagger可以正確使用這些方法,您可能會獲得一些性能。

從靜態提供者返回新的片段實例怎么辦?

 @Provides @ActivityScoped static MyFragment provideFragment() { return MyFragment.createInstance(); } 

我相信這實際上可以。 這是一個靜態方法,它返回Fragment的新實例,並且不應包含任何副作用。

確保,雖然,你重新創建@ActivityScoped每當活動得到重建分量和片段保持其狀態。 您真的想避免FragmentManager管理與您組件中的Fragment不同的Fragment,或者更糟糕的是,兩者都管理。

暫無
暫無

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

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