插件开发:IResourceChangeListener仅在一次更改时调用多次

时间:2017-03-04 09:03:09

标签: eclipse plugins resources listener

我正在使用IResourceChangeListener来监听资源的变化。 我的代码是:

 public void createPartControl(Composite parent) {

// Graph will hold all other objects
graph = new Graph(parent, SWT.NONE);

// create the graph with the right nodes and connections.
init();

//listen to changes in the resource.

workspace = ResourcesPlugin.getWorkspace();
resourceChangeListener = new IResourceChangeListener() {
   public void resourceChanged(IResourceChangeEvent event) {
     //IResourceDelta delta = event.getDelta();

     Display.getDefault().asyncExec(new Runnable() {
       public void run() {
         init();
         System.out.println("Something changed!"); 
         }
   });
   }
};
workspace.addResourceChangeListener(resourceChangeListener);

  }


  public void dispose() {
    workspace.removeResourceChangeListener(resourceChangeListener);

  }

但是,当我只对资源进行一次更改并保存时,监听器不止一次调用! (通常是两次,但有时甚至是6次!!!)

我尝试使用delta来查看它是否在项目,文件夹,文件中调用.. 我没有看到电话之间的差异(也许我没有正确使用它)。

我找到了这个链接,但我没有找到解决方案来解决我的问题 IResourceChangeListener being called twice with one change

如何修复我的代码? 感谢。

1 个答案:

答案 0 :(得分:0)

您无法在侦听器代码中执行任何操作来更改您获得的资源更改事件的数量。这完全取决于进行更改的代码是如何进行更改的。

您可能会发现<Grid Visibility="{x:Bind Something, Converter={StaticResource myconv}, TargetNullValue='Collapsed'}"> IResourceDelta.getKind在事件中返回不同的值。还有IResourceDelta.getFlagsgetMovedFromPath用于重命名或移动操作。

如果您的代码正在进行更改,您可以使用getMovedToPathWorkspaceJob对工作区进行原子更改,这也会减少资源更改事件的数量。

您可能还想检查是否正确删除了旧的侦听器。