1

我有一个 TabLayout,在每个选项卡下都有一个 Fragment(我使用的是 ArrayPagerAdapter)。我注意到,当我从一个选项卡多次切换到另一个选项卡时,我的内存使用量会增加很多。从我的堆快照中,我可以看到有很多 AutoCompleteTextView 实例。

Android的工作室记忆工具

所以我确信问题可能出在这里:

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 的内存工具参考树

但我不明白问题到底出在哪里。

4

1 回答 1

1

其他人注意:发帖人和我就这个问题进行了一次非 SO 讨论,发帖人创建了这个能够重现问题的示例应用程序。


经过一番挣扎,我能够让LeakCanary工作。它需要1.4-beta1与运输1.3.1。我需要做的就是添加依赖项并根据文档设置一个Application子类。LeakCanary然后,启动应用程序并在活动出现后按 BACK。

你得到:

LeakCanary 输出

这到底是框架的bug,还是由appcompat-v7及其具体子类引入的东西MultiAutoCompleteTextView,我目前还不能说。但是,这绝对不是您代码中的错误。

MultiAutoCompleteTextView从片段的( setAdapter(null)) 中清除适配器onDestroyView()应该可以防止它泄漏活动,但小部件本身仍然会泄漏。MultiAutoCompleteTextView快速浏览相关代码并没有给我太多希望,即无需修改框架(for )或appcompat-v7(for its subclass)就可以修复泄漏本身。

于 2016-02-05T21:39:39.807 回答