美文网首页
android 输入法导致内存泄露问题

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

作者: xingtangcunliu | 来源:发表于2016-05-03 17:25 被阅读0次

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

    相关文章

      网友评论

          本文标题:android 输入法导致内存泄露问题

          本文链接:https://www.haomeiwen.com/subject/nrqrrttx.html