android 输入法导致内存泄露问题
该方法侵入太高,必须重新EditText,如果我们直接使用一个第三方的控件包含了EditText,那么这么做就没有意义,所以放弃了这种方案,然后我又想出了其他方案,Android 输入法导致内存泄露以及WebView内存泄露解决方案
Android 输入法会导致内存泄露,基本原因就是inputMethodManager持有了EditText的引用,进而持有了activity的引用导致的内存泄露,现在提供的基本方法就是通过反射把inputMethodManager以及相关的持有引用赋值null,但因为Android平台的多样性,内部代码被修改的乱七八糟,该种方法适用性不高。
我是通过继承EditText可以解决这个泄露问题。具体实现如下,
<code>
import java.lang.reflect.Field;
import android.annotation.SuppressLint;
import android.content.Context;
import android.util.AttributeSet;
import android.view.View;
import android.widget.EditText;
public class BaseEditText extends EditText {
private static Field mParent;
static {
try {
mParent = View.class.getDeclaredField("mParent");
mParent.setAccessible(true);
} catch (NoSuchFieldException e) {
e.printStackTrace();
}
}
public BaseEditText(Context context) {
super(context.getApplicationContext());
}
public BaseEditText(Context context, AttributeSet attrs) {
super(context.getApplicationContext(), attrs);
}
public BaseEditText(Context context, AttributeSet attrs, int defStyleAttr) {
super(context.getApplicationContext(), attrs, defStyleAttr);
}
@SuppressLint("NewApi")
public BaseEditText(Context context, AttributeSet attrs, int defStyleAttr,
int defStyleRes) {
super(context.getApplicationContext(), attrs, defStyleAttr, defStyleRes);
}
@Override
protected void onDetachedFromWindow() {
try {
if(mParent != null)
mParent.set(this, null);
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (IllegalArgumentException e) {
e.printStackTrace();
}
super.onDetachedFromWindow();
}
}
</code>
通过传入ApplicationContext使editview和activity解除绑定,再通过发射使editviews所持有的父view为null,这样就解决了activity的内存泄露,但这种方法有一个问题,字体颜色会变成白色,所以要自己添加颜色,在华为手机测试内存不泄露,只是editview本身释放不掉,但activity没有泄露,这种方法可以接受。具体有没有其他问题,暂时没有遇到,如果有问题,可以告诉我一下,谢谢。