eclipse资源改变通知机制
请参见原文:
http://www.eclipse.org/articles/Article-Resource-deltas/resource-deltas.html
Resource Change Listener
接口:IresourceChangeListener
|
IWorkspace workspace = ResourcesPlugin.getWorkspace(); IResourceChangeListener listener = new IResourceChangeListener() { public void resourceChanged(IResourceChangeEvent event) { System.out.println("Something changed!"); } }; workspace.addResourceChangeListener(listener); //... some time later one ... workspace.removeResourceChangeListener(listener); |
在资源改变的通知期间,workspace会locked来避免产生更多的通知。
Resource API
Resource API在执行creating,copying,moving和deleting操作时会向外广播资源改变事件。
资源操作会嵌套,如Ifile.move操作会触发一个Ifile.create操作创建新的文件,然后再触发一个Ifile.delete操作删除老文件。所以一个Ifile.move操作嵌套了一个Ifile.create操作和一个Ifile.delete操作,但是以上操作只会通知一次。
Batching Changes
当有一批资源改变事件需要通知时,需要采用Batching的方式来提高性能。这样能保证只有一个资源改变事件被广播了出去,而不是多个。
|
IWorkspace workspace = ResourcesPlugin.getWorkspace(); final IProject project = workspace.getRoot().getProject("My Project"); IWorkspaceRunnable operation = new IWorkspaceRunnable() { public void run(IProgressMonitor monitor) throws CoreException { int fileCount = 10; project.create(null); project.open(null); for (int i = 0; i < fileCount; i++) { IFile file = project.getFile("File" + i); file.create(null, IResource.NONE, null); } } }; workspace.run(operation, null); |
eclipse 3.0不再保证IworkspaceRunnable它在执行期间会阻止其他的通知发生。这样做的原因是为了保证能够在通知发生期间能够使UI相应用户事件。
eclipse 3.0中引入了一个新类WorkspaceJob,可以将大量的Workspace资源改变操作放到一个Job中在后台执行。
一个更强大的特点当资源在Workspace外部被更改ResourceChangeListener也会被通知到,比如直接对文件系统的文件进行更改。由于大多数的操作系统并没有这种机制,所以需要执行Iresource.refreshLocal操作后,资源改变会通知所有的Listener.
IResourceChangeEvent
l Event Type
PRE_CHANGE,POST_CHANGE,PRE_BUILD,POST_BUILD,PRE_CLOSE,POST_CLOSE,PRE_DELETE,POST_DELETE
l IresourceDelta
IresourceDelta.getKind()






