该方法侵入太高,必须重新EditText,如果我们直接使用一个第三方的控件包含了EditText,那么这么做就没有意义,所以放弃了这种方案,然后我又想出了其他方案,Android 输入法导致内存泄露以及WebView内存泄露解决方案

Android 输入法会导致内存泄露,基本原因就是inputMethodManager持有了EditText的引用,进而持有了activity的引用导致的内存泄露,现在提供的基本方法就是通过反射把inputMethodManager以及相关的持有引用赋值null,但因为Android平台的多样性,内部代码被修改的乱七八糟,该种方法适用性不高。

我是通过继承EditText可以解决这个泄露问题。具体实现如下,

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);}@Overrideprotected void onDetachedFromWindow() {    try {        if(mParent != null)        mParent.set(this, null);    } catch (IllegalAccessException e) {        e.printStackTrace();    } catch (IllegalArgumentException e) {        e.printStackTrace();    }    super.onDetachedFromWindow();}

}

通过传入ApplicationContext使editview和activity解除绑定,再通过发射使editviews所持有的父view为null,这样就解决了activity的内存泄露,但这种方法有一个问题,字体颜色会变成白色,所以要自己添加颜色,在华为手机测试内存不泄露,只是editview本身释放不掉,但activity没有泄露,这种方法可以接受。具体有没有其他问题,暂时没有遇到,如果有问题,可以告诉我一下,谢谢。

更多相关文章

  1. Android(安卓)4.0 捕获Home键
  2. Android(安卓)7.0上面.OpenSSLSocketImpl.startHandshake报异常
  3. android 中定时器的几种写法
  4. Android截屏方法总结
  5. Android蓝牙开发浅谈【转】
  6. android如何停止Thread和AsyncTask
  7. Android(安卓)中自定义控件和属性(attr.xml,declare-styleable,T
  8. Android(安卓)源码分析 - 事件分发机制
  9. Roboletric+Retrofit2单元测试

随机推荐

  1. Android上运行本地c
  2. Android Studio 模板(Template)定制
  3. android dialog——自定义对话框之一
  4. android View的getHeight和getMeasuredHe
  5. android 机器人:Animations
  6. Android控件_ProgressBar使用
  7. Android学习——windows下搭建NDK_r9环境
  8. Android(安卓)Eclipse导入源码时对自己新
  9. StevGuo系列文章翻译之Android电源管理
  10. Android仿印象笔记的自定义菜单控件