gpt4 book ai didi

java - 何时可以在 android 中使用强引用并且此代码是否泄漏?

转载 作者:搜寻专家 更新时间:2023-11-01 09:24:04 25 4
gpt4 key购买 nike

我不清楚什么时候最好使用 WeakReference 来避免 android 中的内存泄漏。示例:
fragment 中的代码:

containerView.setDataForDisplay(customer, new CustomListener() {    
@Override
public void buttonClicked(@NonNull Customer customer) {
if(handler != null) {
handler.buttonClickedForCustomer(customer);
}
}
});

自定义LinearLayout里面的代码

public void setDataForDisplay(List<Customer> customer, CustomListener listener) {  
// view setup code

someView.setOnClickListener( v -> {
if(listener != null) {
listener.buttonClicked(v.getTag());
}
});
}

匿名类 CustomListener 引用了包含 fragment 的 this
该匿名类作为监听器传递给包含 View ,该 View 最终会进行回调。

我的问题是这会导致内存泄漏吗?
listener 是否应该以某种方式保存在 WeakReference 中?我们如何决定何时可以使用强引用还是使用弱引用?

最佳答案

不,这不是内存泄漏。

一个简化的引用图可能看起来像这样:

references graph

没错,该图确实包含循环引用,但垃圾收集器完全能够检测并解决这种情况。在系统失去对 Fragment 的引用后,整个图表将被 GC,这通常会在它从屏幕上消失的时候出现。

我无法设计WeakReference 需要 来防止内存泄漏的情况。 (我并不是说它们不存在,我只是想不出一个。)

我将 WeakReferences 视为高级内存管理任务的工具,这种工具在一般应用程序开发中很少出现。比如:管理大型项目的集合,如果其中一些项目被 GC 处理(因为内存耗尽)OK,但您宁愿将它们保留在 RAM 中.

IOW:不要保留任何不需要的引用资料,这样应该没问题。

关于java - 何时可以在 android 中使用强引用并且此代码是否泄漏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52128265/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com