2013-07-21 5 views
4

Я разработал небольшой API для диалоговых фрагментов на основе библиотеки поддержки Google с очень простыми требованиями:Backstack и утечка памяти

  • 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

Почему бы вам просто не проверить? Создайте несколько диалогов и отклоните их различными способами (назад/нормально). Затем запустите кучи дампа, используя 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?

UPDATE: Я вижу ваши DIALOG_TAG не меняется, так что вы держите только один Fragment в backstack в то время, потому что вы удалить старую, если она существует. В этом случае у вас может не быть проблемы с низкой памятью.

+0

Где он снимает старый? 'reject()' ing это не то же самое, что удалить его! Я достаточно уверен, что в этом случае рост просто растет. – Delyan

+0

Посмотрите на его метод 'showDialogFragment()', где он называет 'ft.remove (prev);'. Перед добавлением он удаляет предыдущий. –

+0

К сожалению, пропустил это в первый раз. – Delyan

3

Я считаю, что это не утечка, но, чтобы быть уверенным, что вам нужно его протестировать. Как сказал talkol, вы должны использовать Eclipse MAT для анализа этой проблемы. Существует хороший путеводитель от vogel here и хорошее руководство по Android-блогу here. Создайте и закройте кучу диалогов и посмотрите, не изменилось ли это.

На боковой ноте, почему вы используете ft.close() вместо prev.dismiss() в своем методе showDialogFragment(). Правильный способ закрытия диалоговых окон - dismiss().

+0

Я не использую ft.close(). Я использую ft.remove() для удаления из предыдущего стека. – Nulldevice

Смежные вопросы