如何判断一个侦听器是否已经在运行?

问题描述:

我正在给我的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); 
} 

但我不知道如何让听者价值?

+2

什么库TCComponentItemRevision来自?答案将在该图书馆的javadocs – 2012-08-14 15:21:30

+0

此代码看起来像“Visual C++”或什么 – Cratylus 2012-08-14 15:22:08

我不知道什么是TCComponentItemRevision类,但因为这个代码是一个Sigleton里面反正你可以使用一个boolean addedListener的Sigleton里面,以检查是否监听已添加:

if (!addedListener) { 
    tcRevision.getSession().addAIFComponentEventListener(this); 
    addedListener = true; 
} 
+0

这是我用它的答案,它根据需要工作。 – 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方法。如果没有,可能会有一个名称不同但行为相同的方法。如果会话没有这样的方法,那么你不得不用另一种更复杂的方法(如保持这你已经听会话列表。

希望这有助于!