Android EditText内存泄漏

问题描述 投票:6回答:4

很多人注意到,即使活动结束,活动中的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直方图

“内存泄漏”

android memory-leaks android-edittext android-textattributes
4个回答
0
投票

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

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

  2. 最有力的方法是通过TextLine进行反射并找到ChangeWatcher侦听器,然后杀死该侦听器。


0
投票

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

说明:

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


0
投票

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

说明:

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


-1
投票

为此特定视图(包含任何android:textIsSelectable =“ true”组件,尝试在onCreateView()中使用应用程序上下文而不是活动上下文)。

// 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;
}
© www.soinside.com 2019 - 2024. All rights reserved.