0

InputMethodManager は、破棄されたアクティビティへのソフト参照を保持しています。以下は、私の HPROF ダンプ ヒストグラムです。

  • android.view.inputmethod.InputMethodManager$ControlledInputConnectionWrapper @ 0x43b7f768 ネイティブ スタック
  • mInputConnection java.lang.ref.SoftReference @ 0x42b51da0
  • com.android.internal.widget.EditableInputConnection @ 0x43b7f738
  • mTextView、mTargetView android.support.v7.internal.widget.TintEditText @
  • mClipExMgr android.sec.clipboard.ClipboardExManager @ 0x434ee190
  • マイアクティビティ

おそらくEditTextです。アクティビティの onDestroy で、ビューのリスナーも削除する必要がありますか? それとも、これを無視する必要がありますか?

4

1 に答える 1

1

通常、リスナーはビューを参照しません。ビューはもちろんリスナーを参照し、リスナーは囲んでいるオブジェクト (通常はアクティビティ) を参照します。そのため、ビューが参照されなくなった場合、それらは解放される可能性があります。その後、まだ参照されていない限り、リスナーが解放される可能性があります。次に、まだ参照されない限り、それを囲んでいるアクティビティまたは何かが解放される可能性があります。そのため、リスナーを削除する必要はありません(ビュー参照し、長寿命のデータ構造から参照されている場合を除きます)。

アクティビティがビューを参照する場合、ビューはまとめて解放されることがあります。したがって、リスナーを解放する必要はありません。

OTOH、ビューよりも長く存続する必要があるオブジェクトからビューが参照されていないことを確認してください。

また、アクティビティが画面から消えたときに、アクティビティによって作成された非静的ランナブルが停止することを確認してください。実行中のコードが参照されるため、(アクティビティなどの) 囲んでいるインスタンスが参照されるため、それが参照するすべてが参照されます。

PSソフト参照を使用する正しい方法は次のとおりであることを知っていただければ幸いです。

MyActivity m = mySoftRef.get();
if (m != null) {
    doStuff(m.somefield);
}

ではない

if (mySoftRef.get() != null) {
    // NOTE: mySoftRef may get set to null at this point !!!
    doStuff(mySoftRef.get().somefield);
}
于 2015-02-04T11:39:42.897 に答える