1

У меня есть TabLayout, под каждой вкладкой есть фрагмент (я использую ArrayPagerAdapter). Я заметил, что при многократном переключении с вкладки на другую использование памяти значительно увеличивается. Из моего снимка кучи я вижу, что существует много экземпляров AutoCompleteTextView.Не удается найти утечку, на моем фрагменте андроида код

Android's studio memory tool

Поэтому я убежден, что эта проблема может быть здесь:

public class MyFragment { 
... 
    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
    ... 
    final MultiAutoCompleteTextView eInput = (MultiAutoCompleteTextView) v.findViewById(R.id.TextInput); 
    EditorListener mEditorListener = new EditorListener(); 
    eInput.setOnEditorActionListener(mEditorListener); 
    eInput.addTextChangedListener(new WhitespaceWatcher()); 
    eInput.setAdapter(mDictionaryAdapter); 
    eInput.setTokenizer(new SpaceTokenizer()); 
    ... 
    } 
... 
    class EditorListener implements TextView.OnEditorActionListener 
    { 
    @Override 
    public boolean onEditorAction(TextView textView, int actionId, KeyEvent keyEvent) { 
    ... 
    MultiAutoCompleteTextView input = (MultiAutoCompleteTextView) textView.findViewById(R.id.TextInput); 
    ... 
    } 
} 
... 
} 

Android Studio's memory tool Reference tree

Но я не могу понять, где именно проблема.

+0

Ну, будет один виджет 'AutoCompleteTextView' для каждого фрагмента, который вы загрузили. «ArrayPagerAdapter» работает как «FragmentPagerAdapter», поскольку все страницы хранятся в памяти. – CommonsWare

+0

Да, я знаю об этом. Моя проблема в том, что - из того, что я могу видеть в Instances on Android Studio - каждый раз, когда я переключаю вкладку, сюда приходит новый экземпляр AutoCompleteTextView. Поэтому, если у меня есть 4 вкладки, и я переключаю любую из вкладок 4 раза, я получаю 16 экземпляров AutoCompleteTextView. Любая идея причины? Благодарю. – MoreOver

+0

Вам нужно будет отследить, где вы создаете эти экземпляры. Например, 'onCreateView()' вызывается 4 раза или 16 раз? Если последний, отследите места, где вы создаете экземпляры фрагмента, и посмотрите, вызваны ли они 4 раза или 16 раз. Конечно, возможно, что в «ArrayPagerAdapter» есть ошибка: например, я никогда не использовал его с «appcompat-v7», и, насколько я знаю, эти два будут плохо взаимодействовать по какой-то неожиданной причине. – CommonsWare

ответ

1

Примечание для других: плакат, и у меня была внесогласованная дискуссия по этому вопросу, и плакат создал this sample app, который смог воспроизвести проблему.


Через некоторое Борясь я смог LeakCanary работать. Он требовал 1.4-beta1 против доставки 1.3.1. Все, что мне нужно было сделать, это добавить зависимости и настроить подкласс Application в отношении документов LeakCanary. Затем запустите приложение и нажмите BACK, как только появится действие.

Вы получаете:

LeakCanary Output

ли это рамочный ошибка или что-то введено appcompat-v7 и его конкретный подкласс MultiAutoCompleteTextView, я не могу сказать, в настоящее время. Тем не менее, это определенно не ошибка в коде.

Очистка адаптер от MultiAutoCompleteTextView (setAdapter(null)) в onDestroyView() фрагмента должен предотвратить его утечку активности, но сам виджет будет все еще просачиваться. Быстрое сканирование соответствующего кода не дает мне большой надежды на то, что сама утечка может быть исправлена ​​без изменений в каркасе (для MultiAutoCompleteTextView) или appcompat-v7 (для его подкласса).

+0

Проблема не ограничивается 'appcompat-v7' или даже' MultiAutoCompleteTextView'. Проблема проявляется в 'AutoCompleteTextView', используя собственные действия и фрагменты. Я отправил [отчет об ошибке] (https://code.google.com/p/android/issues/detail?id=200423), используя переработанную версию вашего примера приложения, которая устраняет много генерируемых шаблонами крипов (для обеспечения того, чтобы трещина не способствовала этой проблеме). – CommonsWare

+0

Хорошая работа! Спасибо, что помогли мне понять проблему. – MoreOver

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