如果触发消费者的侦听器包含在WeakReference中,我是否仍保留对消费者所有者的引用?

问题描述

赞:

Proc是功能接口类型为void。

public class MainViewPagerviewmodel extends viewmodel {

    private HashMap<Integer,Integer> quantities = new HashMap<>();
    private WeakReference<Proc> weakProc;

    public void put(Integer position,Integer quantity) {
        quantities.put(position,quantity);
        if (weakProc.get() != null) {
            weakProc.get().run();
        }
    }

    public void updatePieChart(Consumer<HashMap<Integer,Integer>> mapConsumer) {
        weakProc = new WeakReference<>(
                () -> mapConsumer.accept(quantities)
        );
    }

}

这项工作是否可行,或者我仍在参考消费者的使用情况?还是...太多了吗?也许够了吗?

    public void updatePieChart(Consumer<HashMap<Integer,Integer>> mapConsumer) {
        
            proc = () -> mapConsumer.accept(quantities)
      
    }

谢谢。

解决方法

首先,这里需要一个非常一般的建议:除非您知道某些构造的作用(在这种情况下为WeakReference),否则请不要使用它。研究它的文档,不仅仅运行一个示例,并且在您满意时使用它。 WeakReference是一种非常有用的工具,您需要了解所有可能遇到的问题和问题。以下是有关hereor heremay be even here的一些介绍。

现在-您想解决什么?您的代码是否在Procprivate WeakReference<Proc> weakProc;周围没有包装的情况下 被破坏了?我认为不是。

通过介绍WeakReference,就像您说Proc(这是定义为lambda表达式的Runnable)一样,而MainViewPagerViewModel仍然活。现在问自己-可能吗?在这里忘记WeakReference一秒钟。 proc仍可以存活时,是否在某个时间点 收集MainViewPagerViewModel?如果是这样的话,当您致电put时会发生什么?

当您对以上问题有答案时,您将了解您的问题几乎没有道理;并且WeakReference的引入是没有用的。