2013-07-21 81 views
4

我已經開發了基於谷歌支持庫有非常簡單的要求,對話的片段一個很小的API:返回堆棧和內存泄漏

  • API可以添加(或更換)模態對話框
  • API可以解僱程序對話框或者用戶可以通過按下按鈕來關閉對話框

我的API是否通過向堆棧不斷添加碎片來創建內存泄漏?

public class DialogFragmentUtils { 

private static final String DIALOG_TAG = "dialogTag"; 

public static void showDialogFragment(@Nullable Activity activity, @NotNull Fragment fragment) { 
    if (activity instanceof FragmentActivity) { 
     FragmentActivity fragmentActivity = (FragmentActivity) activity; 
     FragmentManager fm = fragmentActivity.getSupportFragmentManager(); 
     FragmentTransaction ft = fm.beginTransaction(); 
     Fragment prev = fm.findFragmentByTag(DIALOG_TAG); 
     if (prev != null && prev.isAdded()) { 
      ft.remove(prev); 
     } 
     ft.add(fragment, DIALOG_TAG); 
     ft.addToBackStack(null); 
     ft.commit(); 
    } 
} 

public static void dismissDialogFragment(@Nullable Activity activity) { 
    if (activity instanceof FragmentActivity) { 
     FragmentActivity fragmentActivity = (FragmentActivity) activity; 
     FragmentManager fm = fragmentActivity.getSupportFragmentManager(); 
     DialogFragment dialog = (DialogFragment) fm.findFragmentByTag(DIALOG_TAG); 
     if (dialog != null) { 
      dialog.dismiss(); 
     } 
    } 
} 
} 
+0

因爲擔心內存泄漏,我們在討論多少個對話框? – Warpzit

+3

爲什麼你不檢查?創建幾個對話框並以各種方式關閉它們(返回/ ok)。然後使用Eclipse MAT運行堆轉儲,並在堆中搜索對話框的實例。 – talkol

回答

4

是的,它傾向於低內存,但不是內存泄漏。所有後退堆棧Fragment都保留在內存中,並帶有硬引用。所以,如果你保持一個荒謬的數額Fragment s在後面的堆棧,那麼你會失去記憶。

看一看這裏:When a Fragment is replaced and put in the back stack (or removed) does it stay in memory?

更新:我看你DIALOG_TAG沒有改變,所以你只是一個Fragment在堆棧中保持的時間,因爲你刪除它是否存在舊的。在這種情況下,您可能不會遇到內存不足的問題。

+0

他在哪裏取出舊的? '解僱()'這不同於刪除它!我相當確定在這種情況下,後臺正在增長。 – Delyan

+0

看看他的'showDialogFragment()'方法,他調用'ft.remove(prev);'。在添加之前,他刪除了前一個。 –

+0

哎呀,對不起,第一次錯過了。 – Delyan

3

我相信它不會泄漏,但要確保您需要測試它。正如talkol所說,你應該使用Eclipse MAT來分析這個問題。 vogel here有很好的指導,並且在Android博客here上有很好的指導。創建並關閉一堆對話框,看看它是否有所作爲。

請注意,爲什麼您在showDialogFragment()方法中使用ft.close()而不是prev.dismiss()。關閉對話框的正確方法是dismiss()

+0

我不使用ft.close()。我使用ft.remove()從後面的堆棧中移除。 – Nulldevice