8

很多人都注意到活动中的 EditText 持有对活动的强引用,即使它完成后也是如此。要清楚,此 EditText 位于布局内并膨胀,没有设置 Listeners。这只发生在某些设备上,例如三星 Galaxy S4 (Android 4.2.2) 和其他设备。许多关于此的帖子仍然没有解决方案。首先是一些有用的帖子。(最终 GC 将清除它,因此从技术上讲它不是泄漏,但对于内存大的应用程序,它需要很长时间并且会导致 OOM)

EditText 中的 Android 三星内存泄漏

为什么 EditText 在 Ice Cream Sandwich 中保留其 Activity 的上下文

EditText 导致内存泄漏

未处理的内存泄漏的可能性

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

这是 MAT 直方图

内存泄漏

4

4 回答 4

2

这是因为 EditText 引用了 Activity 的上下文。当Activity被销毁时,Activity无法正常回收,因为Edittext持有对Activity上下文的引用。解决方法:重写EditText,将Activity中对Context的引用改为对ApplicationContext的引用。

指示:

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

于 2020-06-06T04:15:16.047 回答
0

I was confused about this memory leak for a very long time. But recently I found two ways to fix this problem.

  1. I found that if your TextView/EditText has the android:hint property, this cannot happen. So the easiest way is give every TextView/EditText the hint property.

  2. The most forceful way is to reflect over TextLine and find the ChangeWatcher listener, then kill this listener.

于 2015-03-04T03:59:31.620 回答
0

我通过将活动上下文更改为应用程序上下文解决了这个问题。

于 2021-09-08T10:17:12.893 回答
-1

尝试在 onCreateView() 中为这个特定的 View 使用 Application Context 而不是 Activity Context(其中包含任何 android:textIsSelectable="true" 组件)。

// 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;
}
于 2013-10-17T13:49:51.990 回答