在我的片段android代码上找不到泄漏

时间:2016-02-02 12:21:57

标签: android-fragments memory-leaks android-widget commonsware

我有一个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

但我无法理解问题究竟在哪里。

1 个答案:

答案 0 :(得分:1)

请注意其他人:海报和我有关于此问题的非SO讨论,并且海报创建了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(对于它的子类)。