[英]Is it bad in terms of memory usage if I use static fields in activities and fragments?
[英]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.