android 输入法导致内存泄露问题

2016-05-03  本文已影响0人  xingtangcunliu

该方法侵入太高,必须重新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没有泄露,这种方法可以接受。具体有没有其他问题,暂时没有遇到,如果有问题,可以告诉我一下,谢谢。

上一篇下一篇

猜你喜欢

热点阅读