如何判断一个侦听器是否已经在运行?
我正在给我的Singleton类添加一个事件监听器。我使用add方法添加侦听器。如何判断一个侦听器是否已经在运行?
public void add(TCComponentItemRevision tcRevision, TCComponentDataset selectedDataset) {
String revMasterForm;
tcRevision.getSession().addAIFComponentEventListener(this);
try {
revMasterForm = tcRevision.getRelatedComponent("IMAN_master_form_rev").getUid();
RevDataset pp = new RevDataset(tcRevision, selectedDataset, revMasterForm);
if (!rds.contains(pp)) {
rds.add(pp);
}
}
catch (TCException e) {
e.printStackTrace();
}
fireTableDataChanged();
}
我只希望列表添加一次。所以我觉得必须有某种支票。 像
if (listener value == null) {
tcRevision.getSession().addAIFComponentEventListener(this);
}
但我不知道如何让听者价值?
我不知道什么是TCComponentItemRevision
类,但因为这个代码是一个Sigleton里面反正你可以使用一个boolean addedListener
的Sigleton里面,以检查是否监听已添加:
if (!addedListener) {
tcRevision.getSession().addAIFComponentEventListener(this);
addedListener = true;
}
这是我用它的答案,它根据需要工作。 – jkteater 2012-08-14 19:02:59
事件侦听器一般不要“跑”。他们被他们“倾听”或有时被框架调用的项目“调用”。
他们被称为“监听者”而不仅仅是聚集对象集合的原因是因为用于附加和移除“监听”对象的接口是由一个接口定义的,该接口不对具体的类进行假设。相反,回调操作只能通过接口(或很少抽象的类)进行。
现在,任何班级,也许班级都“运行”,但这完全独立于聆听方面。
---与建议编辑有关将听众只有一次---
由于负责添加监听对象通常不是正被听取了代码的一部分,为什么不把“添加“对象在决定将自己添加为侦听器之前查询侦听器?
侦听器模式要求会话(由getSession返回)维护正在侦听的事件的集合。当会话改变时,它通过这个集合并告诉每个听众它已经改变了。它通过在每个侦听器上调用一个方法来实现这一点。允许监听者在该方法中运行任何想要的代码。
如果您尝试确保不多次注册监听,则可以尝试访问该集合(实际上可能是一个数组)。如果可以访问该数组,则在调用tcRevision.getSession()。addAIFComponentEventListener(this)之前;你会通过数组并检查是否有任何条目是'这个'。我的建议是这个样子:
boolean alreadyAdded = false;
for(AIFComponentEventListener currentListener: tcRevision.getSession().getAIFEventListeners()){
if(currentListener == this){
alreadyAdded = true;
}
}
if(! alreadyAdded){
tcRevision.getSession().addAIFComponentEventListener(this);
}
注意,我猜测,有一个叫getAIFEventListeners方法。如果没有,可能会有一个名称不同但行为相同的方法。如果会话没有这样的方法,那么你不得不用另一种更复杂的方法(如保持这你已经听会话列表。
希望这有助于!
什么库TCComponentItemRevision来自?答案将在该图书馆的javadocs – 2012-08-14 15:21:30
此代码看起来像“Visual C++”或什么 – Cratylus 2012-08-14 15:22:08