溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

解決android中EditText導(dǎo)致的內(nèi)存泄漏問題

發(fā)布時間:2020-07-03 15:00:18 來源:網(wǎng)絡(luò) 閱讀:2504 作者:IT學(xué)無止境 欄目:移動開發(fā)

開發(fā)中用到了LeankCanary,在一個簡單的頁面中(例如 :僅僅 包含Edittext),也會導(dǎo)致內(nèi)訓(xùn)泄漏,為此,我在網(wǎng)上找了大量資料,最終解決。
例如一個布局:
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:focusable="true"
android:focusableInTouchMode="true"
android:orientation="vertical">

            <EditText
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_centerVertical="true"
                android:layout_marginLeft="12dp"
                android:background="@null"
                android:hint="4-20位不包含特殊字符"
                android:textSize="15dp" />

<LinearLayout>

以上會導(dǎo)致內(nèi)存泄漏,是由于EditText引用了Activity的context的原因,在Activity銷毀的時候,
由于Edittext持有對Activity的context的引用,導(dǎo)致Activity無法正?;厥铡?br/>解決辦法:重寫EditText,將對Activity中Context的引用,改為對ApplicationContext的引用。
代碼如下:

@SuppressLint("AppCompatCustomView")
public class BaseEditText extends EditText {

private static java.lang.reflect.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();
}

}

然后xml中的布局引用自定義的EditText:

             <包名.路徑.BaseEditText
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_centerVertical="true"
                android:layout_marginLeft="12dp"
                android:background="@null"
                android:hint="4-20位不包含特殊字符"
                android:textSize="15dp" />

另外,由于LinearLayout獲取了焦點(diǎn),也可能會導(dǎo)致內(nèi)存的泄漏,
需要在Activity中的onDestroy里清除掉焦點(diǎn):
LinearLayout.clearFocus();

再次測試,問題解決!

感謝 https://www.jianshu.com/p/e1b41fb80cdc 文章的啟發(fā)。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI