現在までに発見したメモリリークの最終記事です。
compileSdkVersionを26に上げたところ、LeakCanaryでメモリリークを検出しました。
検出端末は、Xperia performanceです。
そのときのLeakCanaryのスクリーンショットが以下です。
![]() |
LeakCanary |
InputConnectionWrapperのmTargetが解放されないようです。
よって、上記が解放されるように対応しました。
まず、EditTextの代わりに自作のMyEditTextを用意しました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | package com.bnbnapp.checkleakedittext; import android.content.Context; import android.util.AttributeSet; import android.view.inputmethod.EditorInfo; import android.view.inputmethod.InputConnection; public class MyEditText extends android.support.v7.widget.AppCompatEditText { public MyEditText(Context context) { super (context); } public MyEditText(Context context, AttributeSet attrs) { super (context, attrs); } public MyEditText(Context context, AttributeSet attrs, int defStyleAttr) { super (context, attrs, defStyleAttr); } @Override public InputConnection onCreateInputConnection(EditorInfo outAttrs) { InputConnection ic = super .onCreateInputConnection(outAttrs); if (ic != null ) { // メモリリーク発生のため、MyInputConnectionWrapperを使用 return new MyInputConnectionWrapper(ic, true ); } return null ; } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | package com.bnbnapp.checkleakedittext; import android.view.inputmethod.InputConnection; import android.view.inputmethod.InputConnectionWrapper; class MyInputConnectionWrapper extends InputConnectionWrapper { MyInputConnectionWrapper(InputConnection target, boolean mutable) { super (target, mutable); } @Override public void closeConnection() { super .closeConnection(); // メモリリーク発生のため、クローズした後にnullを設定 setTarget( null ); } } |