在 android 中使用静态上下文项时发生内存泄漏
Memory leaks when using static context items in android
所以我有一个带有静态 UI 元素的 class,如下所示:
class MyClass {
companion object {
lateinit var item:ChannelItem
}
}
// Item from groupie
class ChannelItem(var channel:Channel): Item<ViewHolder>() {
// bind
// getLayout
}
这似乎会导致内存泄漏,有没有快速修复的方法而不需要过多更改代码?
我正在考虑将项目替换为
var map = mutableMapOf<String, ChannelItem?>()
这会修复内存泄漏吗?如果是,为什么?
非常感谢
静态 UI 元素在 Android 中没有意义 首先,UI 对象绑定到特定的 Activity。它们不能在其他活动中使用,也不能在 Activity 之外显示。所以让它们静态化并没有带来价值
其次,这始终是内存泄漏。每个视图都有对其 Activity 的引用。将 Activity 放在静态变量中意味着它不能被垃圾回收,因为存在对它的有效引用。这基本上会导致 Activity 中的每个变量泄漏。包括 UI 元素,它们往往会占用大量内存(每个图像每个像素占用 4 个字节)。
您需要重新考虑要使用此代码做什么。其实我也说不清。如果您将它们设为静态以便您可以从其他活动中更改它们 - 不要那样做。使它们基于模型对象,并改为更改模型中的数据。让 UI 根据模型重新初始化自身。
所以我有一个带有静态 UI 元素的 class,如下所示:
class MyClass {
companion object {
lateinit var item:ChannelItem
}
}
// Item from groupie
class ChannelItem(var channel:Channel): Item<ViewHolder>() {
// bind
// getLayout
}
这似乎会导致内存泄漏,有没有快速修复的方法而不需要过多更改代码?
我正在考虑将项目替换为
var map = mutableMapOf<String, ChannelItem?>()
这会修复内存泄漏吗?如果是,为什么?
非常感谢
静态 UI 元素在 Android 中没有意义 首先,UI 对象绑定到特定的 Activity。它们不能在其他活动中使用,也不能在 Activity 之外显示。所以让它们静态化并没有带来价值
其次,这始终是内存泄漏。每个视图都有对其 Activity 的引用。将 Activity 放在静态变量中意味着它不能被垃圾回收,因为存在对它的有效引用。这基本上会导致 Activity 中的每个变量泄漏。包括 UI 元素,它们往往会占用大量内存(每个图像每个像素占用 4 个字节)。
您需要重新考虑要使用此代码做什么。其实我也说不清。如果您将它们设为静态以便您可以从其他活动中更改它们 - 不要那样做。使它们基于模型对象,并改为更改模型中的数据。让 UI 根据模型重新初始化自身。