很多人注意到活动中的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
Possibility of unhandled memory leak
所提到的解决方案并非适用于所有设备。它归结为Edittext Watcher。我认为可能有一个解决方案来覆盖这个Watcher然后有一个函数来清理onDestroy()。请在这里帮忙,我已经好几天了。
这是MAT直方图
答案 0 :(得分:0)
很长一段时间我对此内存泄漏感到困惑。但最近我发现了两种解决这个问题的方法。
我发现如果TextView / EditText具有android:hint
属性,则不会发生这种情况。因此,最简单的方法是为每个TextView / EditText提供提示属性。
最有力的方法是反映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;
}