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 出力

これがフレームワークのバグなのか、appcompat-v7と の特定のサブクラスによって導入されたものなのかMultiAutoCompleteTextView、現時点ではわかりません。ただし、これは間違いなくコードのバグではありません。

MultiAutoCompleteTextViewフラグメントの( setAdapter(null))からアダプタをクリアするonDestroyView()と、アクティビティのリークを防ぐことができますが、ウィジェット自体は引き続きリークします。MultiAutoCompleteTextView関連するコードを簡単にスキャンしただけでは、フレームワーク ( の場合) またはappcompat-v7(そのサブクラスの場合)を変更せずにリーク自体を修正できるとは思えません。

于 2016-02-05T21:39:39.807 に答える