您对内存泄漏原因的观察并不完全正确。
存储对视图元素的引用非常好,您如何执行此操作并使用它们可能会导致内存泄漏。例如,避免使用静态引用,例如,如果您静态引用位图图像,您可能会无意中导致垃圾收集问题,正如 Simon 在他的回答中指出的那样。
因此,可以执行以下操作。
class{
private TextView myTextView;
onCreate()
myTextView = findViewById(R.id.mytextview);
myMethod()
myTextView.text = "hello view."
}
myMethod 使用现有的参考纯粹是为了方便,没有什么能阻止你把
findViewById(R.id.mytextview).text = "hello view";
但是,如果您有很多参考资料,那将导致代码非常不可读。因此,您可以使用局部范围变量。
myMethod()
TextView myTextView = findViewById(R.id.mytextview);
myTextView.text = "Hello"
.....
根据您的个人喜好,它不一定会导致内存泄漏。
现在这里的问题是 findViewById 是一个密集的过程,所以你真的不想重复调用它。列表视图特别容易出现这种情况,如果你不满足这种情况,它会显着减慢速度。
因此,在列表视图中,您会发现人们实现了 viewHolder 模式。您分配对视图子元素的引用的小对象。然后将此对象分配给父视图的 Tag 属性。在对视图的后续调用期间,您测试查看视图标记属性是否具有 viewHolder,如果有,它将引用子对象,从而节省您每次需要更新视图内容时调用 findViewById 的时间和精力。
非常粗略的想法,其实现方式略有不同。viewHolder = 新的 ViewHolder(); viewHolder.myTextField = findViewById(R.id.mytextview); myView.setTag(viewHolder) .... if (viewHolder) viewHolder.text = "hello"
请注意,您只能在列表视图中使用它。我没有将其用作一般的经验法则。
查找列表视图适配器的有效视图持有者模式。