Android EditText内存泄漏

时间:2013-08-21 02:44:48

标签: android memory-leaks android-edittext android-textattributes

很多人注意到活动中的EditText即使一旦完成也会持有对活动的强引用。要清楚这个EditText在布局中并且已经膨胀,没有设置监听器。这只发生在某些设备上,例如三星Galaxy S4(Android 4.2.2)等。很多帖子都说没有解决方案。首先是一些有用的帖子。 (最终GC会清理它,所以它在技术上不是泄漏,但对于重型内存应用程序,它需要很长时间才会导致OOM)

Android Samsung Memory leak in EditText

Why does EditText retain its Activity's Context in Ice Cream Sandwich

EditText causing memory leak

Possibility of unhandled memory leak

所提到的解决方案并非适用于所有设备。它归结为Edittext Watcher。我认为可能有一个解决方案来覆盖这个Watcher然后有一个函数来清理onDestroy()。请在这里帮忙,我已经好几天了。

这是MAT直方图

Memory Leak

4 个答案:

答案 0 :(得分:0)

很长一段时间我对此内存泄漏感到困惑。但最近我发现了两种解决这个问题的方法。

  1. 我发现如果TextView / EditText具有android:hint属性,则不会发生这种情况。因此,最简单的方法是为每个TextView / EditText提供提示属性。

  2. 最有力的方法是反映TextLine并找到ChangeWatcher侦听器,然后终止此侦听器。

答案 1 :(得分:0)

这是因为EditText引用了Activity的上下文。当活动被销毁时, 由于Edittext拥有对活动上下文的引用,因此无法正常回收活动。 解决方案:重写EditText,将对活动中的上下文的引用更改为对ApplicationContext的引用。

说明:

https://programming.vip/docs/solve-the-memory-leak-problem-caused-by-edittext-in-android.html

答案 2 :(得分:0)

EditText引用Activity的上下文。当活动被销毁时, 由于Edittext拥有对活动上下文的引用,因此无法正常回收活动。 解决方案:重写EditText,将对活动中的上下文的引用更改为对ApplicationContext的引用。

说明:

https://programming.vip/docs/solve-the-memory-leak-problem-caused-by-edittext-in-android.html

答案 3 :(得分:-1)

尝试在onCreateView()中为此特定视图(包含任何android:textIsSelectable =“true”组件)使用Application Context而不是Activity Context。

// Singleton
class MyApplication extends Application {
    private static MyApplication mApp;

    @Override
    public void onCreate() {
        mApp = this;
    }

    public static MyApplication getApp() {
        return mApp;
    }
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    // Suggested inflater use Activity Context
    // So we must tu use Application Context
    Context context = MyApplication.getApp().getApplicationContext();
    LayoutInflater myLayoutInflater = LayoutInflater.from(context);

    View view = myLayoutInflater.inflate(R.layout.my_view, container, false);
    return view;
}