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

Can't find the leak, on my fragment android code

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

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

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);
    ...
  }
}
...
}

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

其他人请注意:发帖人和我就此问题进行了非正式讨论,发帖人创建的 this sample app 能够重现该问题。


经过一番努力,我能够让 LeakCanary 工作。它需要 1.4-beta1 而不是运费 1.3.1。我需要做的就是添加依赖项并根据 LeakCanary 文档设置一个 Application 子类。然后,启动应用程序并在 activity 出现后按返回。

你得到:

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

从片段的 onDestroyView() 中的 MultiAutoCompleteTextView (setAdapter(null)) 清除适配器应该可以防止它泄漏 activity,但小部件本身仍然会泄漏.快速扫描相关代码并没有给我太大希望,即可以在不修改框架(对于 MultiAutoCompleteTextView)或 appcompat-v7(对于其子类)的情况下修复泄漏本身。