在我的片段 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
(对于其子类)的情况下修复泄漏本身。
我有一个 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
(对于其子类)的情况下修复泄漏本身。