如何判断监听器是否已在运行?

时间:2012-08-14 15:14:50

标签: java

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

但我不确定如何获得听众价值?

3 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

事件监听器通常不会“运行”。它们被“监听”或(有时)被框架调用的项目“调用”。

它们被称为“侦听器”而不仅仅是聚合对象集合的原因是因为附加和删除“侦听”对象的接口是由不对具体类做出假设的接口定义的。相反,回调操作仅通过接口(或很少抽象的类)发生。

现在,对于任何一个类,也许该类确实“运行”,但这完全独立于倾听方面。

---编辑了关于只添加一次监听器的建议---

由于负责添加侦听器的对象通常不是正在侦听的代码的一部分,为什么不在决定将自己添加为侦听器之前让“添加”对象查询侦听器?

答案 2 :(得分:0)

侦听器模式要求会话(由getSession返回)维护正在侦听它的事物的集合。会话更改时,它会遍历此集合并告诉每个侦听器它已更改。它通过在每个侦听器上调用方法来完成此操作。允许侦听器在该方法中运行它想要的任何代码。

如果您正在尝试确保不多次注册侦听,则可以尝试访问该集合(实际上可能是一个数组)。如果你可以访问那个数组,那么在调用tcRevision.getSession()之前.addAIFComponentEventListener(this);你会通过数组检查是否有任何条目是'this'。我的建议看起来像这样:

boolean alreadyAdded = false;
for(AIFComponentEventListener currentListener: tcRevision.getSession().getAIFEventListeners()){
    if(currentListener == this){
        alreadyAdded = true;
    }
}
if( ! alreadyAdded ){
    tcRevision.getSession().addAIFComponentEventListener(this);
}

请注意,我猜测有一个名为getAIFEventListeners的方法。如果没有,则可能存在具有不同名称但具有相同行为的方法。如果会话没有这样的方法,那么你将被迫使用另一种更复杂的方法(例如保留你已经听过的会话列表。

希望这有帮助!