问题描述
赞:
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
是一种非常有用的工具,您需要了解所有可能遇到的问题和问题。以下是有关here,or here或may be even here的一些介绍。
现在-您想解决什么?您的代码是否在Proc
:private WeakReference<Proc> weakProc;
周围没有包装的情况下 被破坏了?我认为不是。
通过介绍WeakReference
,就像您说Proc
(这是定义为lambda表达式的Runnable
)一样,而MainViewPagerViewModel
仍然活。现在问自己-可能吗?在这里忘记WeakReference
一秒钟。 proc
仍可以存活时,是否在某个时间点 收集MainViewPagerViewModel
?如果是这样的话,当您致电put
时会发生什么?
当您对以上问题有答案时,您将了解您的问题几乎没有道理;并且WeakReference
的引入是没有用的。