Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/blackberry/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 什么时候可以在android中使用强引用,这段代码是否泄漏?_Java_Android_Android Fragments_Memory Leaks_Android Lifecycle - Fatal编程技术网

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你找到解决方案了吗?你是如何处理这种情况的?