我有一个TabLayout,每个标签下都有一个片段(我正在使用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);
...
}
}
...
}
但我无法理解问题究竟在哪里。
答案 0 :(得分:1)
请注意其他人:海报和我有关于此问题的非SO讨论,并且海报创建了this sample app,能够重现问题。
经过一番挣扎,我能够让LeakCanary工作。它需要1.4-beta1
与运费1.3.1
。我需要做的就是添加依赖项并根据Application
文档设置LeakCanary
子类。然后,启动应用程序并在活动出现后按BACK。
你得到:
这是一个框架错误还是由appcompat-v7
及其MultiAutoCompleteTextView
的特定子类引入的内容,我目前无法说。但是,它绝对不是您代码中的错误。
从片段MultiAutoCompleteTextView
中的setAdapter(null)
(onDestroyView()
)清除适配器可以防止它泄漏活动,但小部件本身仍会泄漏。快速扫描相关代码并没有给我很大的希望,可以修复泄漏本身,而无需修改框架(对于MultiAutoCompleteTextView
)或appcompat-v7
(对于它的子类)。