Java 什么时候可以在android中使用强引用,这段代码是否泄漏?
我不清楚什么时候最好使用Java 什么时候可以在android中使用强引用,这段代码是否泄漏?,java,android,android-fragments,memory-leaks,android-lifecycle,Java,Android,Android Fragments,Memory Leaks,Android Lifecycle,我不清楚什么时候最好使用WeakReference来避免android内存泄漏。示例: 代码片段: containerView.setDataForDisplay(customer, new CustomListener() { @Override public void buttonClicked(@NonNull Customer customer) { if(handler != null) {
WeakReference
来避免android内存泄漏。示例:代码片段:
containerView.setDataForDisplay(customer, new CustomListener() {
@Override
public void buttonClicked(@NonNull Customer customer) {
if(handler != null) {
handler.buttonClickedForCustomer(customer);
}
}
});
自定义线性布局中的代码
public void setDataForDisplay(List<Customer> customer, CustomListener listener) {
// view setup code
someView.setOnClickListener( v -> {
if(listener != null) {
listener.buttonClicked(v.getTag());
}
});
}
public void setDataForDisplay(列出客户、CustomListener侦听器){
//查看设置代码
setOnClickListener(v->{
如果(侦听器!=null){
listener.buttonClicked(v.getTag());
}
});
}
匿名类CustomListener
引用了包含片段的this
该匿名类作为侦听器传递给一个包含视图,该视图最终进行回调
我的问题是这会导致内存泄漏吗?
侦听器
是否应该以某种方式保持在弱引用中
?我们如何决定什么时候可以使用强引用还是弱引用?不,这不是内存泄漏
简化的参考图可能如下所示:
诚然,该图确实包含一个循环引用,但垃圾收集器完全能够检测和处理这种情况。在系统失去对片段的引用后,整个图形将被GC'd,该片段通常会在它从屏幕上消失时出现
我无法设计一种需要WeakReference
来防止内存泄漏的情况。(我不是说它们不存在,我只是想不出一个。)
我将WeakReferences
视为高级内存管理任务的工具,这种工具在一般应用程序开发中很少出现。比如:管理一个大型项目的集合,如果其中一些项目得到GC'd(内存耗尽),这是可以的,但是您更愿意将它们保存在RAM中
IOW:不要保留任何不需要的引用,你应该没事。现代JVM有一个非常强大的垃圾收集器。它通过检测与gc根完全隔离的对象来收集循环引用。您可以在此处阅读有关此主题的更多信息:
通过使用弱引用。但是,您可以加快GC的工作,因为在对该对象的所有强引用都不存在之后,立即引用该引用。好,这是关于依赖性和场景的,让我们以异步任务为例,它要求上下文在后台执行一些任务,现在假设在任务完成之前,您关闭了主机活动。现在在async的后台任务结束了,将查找上下文,但自从主机活动关闭后上下文就不存在了。我们使用弱引用保存数据的那种情况。@notTdar:这种情况假设对异步任务的静态引用,对吗?因为如果它是活动的一个实例变量,会有问题吗?@Jim你找到解决方案了吗?你是如何处理这种情况的?