很多人注意到,即使活动结束,活动中的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直方图
我很长时间以来一直对这种内存泄漏感到困惑。但是最近我发现了两种解决此问题的方法。
我发现,如果您的TextView / EditText具有android:hint
属性,则不会发生这种情况。因此,最简单的方法是为每个TextView / EditText赋予hint属性。
最有力的方法是通过TextLine进行反射并找到ChangeWatcher侦听器,然后杀死该侦听器。
这是因为EditText引用了Activity的上下文。当活动被销毁时,由于Edittext拥有对活动上下文的引用,因此无法正常回收活动。解决方案:重写EditText,将对活动中的上下文的引用更改为对ApplicationContext的引用。
说明:
https://programming.vip/docs/solve-the-memory-leak-problem-caused-by-edittext-in-android.html
EditText引用Activity的上下文。当活动被销毁时,由于Edittext拥有对活动上下文的引用,因此无法正常回收活动。解决方案:重写EditText,将对活动中的上下文的引用更改为对ApplicationContext的引用。
说明:
https://programming.vip/docs/solve-the-memory-leak-problem-caused-by-edittext-in-android.html
为此特定视图(包含任何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;
}