1. 资源改变资源改变可以分为两种情况:
1. 有UI参与的
2. 没有UI参与的
首先介绍没有UI参与的。没有UI参与的时候可以使用以下三种方式:
1.老的IWorkspace的run方法
使用方式如下:
final IFile[] files = getSelectedFiles();
ResourcesPlugin.getWorkspace().run(new IWorkspaceRunnable() {
public void run(IProgressMonitor monitor) throws CoreException {
for (int i = 0; i < files.length; i++) {
files[i].setContents(
modifyContents(files[i].getContents()), false,
true, monitor);
}
}
}, null);
这种方式的问题就在于:
它将锁定我们的任务直到其他的任务完成了并且将继续锁定后续的修改资源的任务直到它完成了
如果monitor传入一个null,那么在我们和任务被阴止时,工作台也提供一个对话框,并且不显示进度!
以上造成的问题之一就是程序响应变得很慢了!
2.新的IWorkspace的run方法
使用方式如下:
final IFile[] files = getSelectedFiles();
ResourcesPlugin.getWorkspace().run(new IWorkspaceRunnable() {
public void run(IProgressMonitor monitor) throws CoreException {
for (int i = 0; i < files.length; i++) {
files[i].setContents(
modifyContents(files[i].getContents()), false,
true, monitor);
}
}
}, modifyRule(files), IResource.NONE, monitor);
这是上面的run方法的改进版。在3.0以后新加的。修改了旧的方式的缺点!应该总是使用新的而不是旧的!
3.使用IProgressService
使用第二种方式显然是挺好的,不过我们可以提供给用户更多的交互,例如取消,显示进度等等。这可以通过
IProgressService实现,通常的使用如下:
其中service的run方法的前两个参数分别表示:fork和cancelable。
final IFile[] files = getSelectedFiles();
WorkspaceModifyOperation op = new WorkspaceModifyOperation(
modifyRule(files)) {
protected void execute(IProgressMonitor monitor)
throws CoreException {
for (int i = 0; i < files.length; i++) {
files[i].setContents(
modifyContents(files[i].getContents()), false,
true, monitor);
}
};
};
// Use the progess service to execute the runnable
IProgressService service = PlatformUI.getWorkbench()
.getProgressService();
try {
service.run(true, true, op);
} catch (InvocationTargetException e) { // Operation was canceled
} catch (InterruptedException e) { // Handle the wrapped exception
}
2. 以上资源改变的第一第二种方式在没有UI参与的情况下可以工作的很好!但是如果有UI的参与,那么可能就会导致问题的发生了!当有UI参与的时候,可以使用第三种方式的另一个方法:runInUI。当然了,我们还可以在一个job中使用syncExec()或asyncExec()方法!所以这个问题是可以解决的!还有一个问题:在代码运行期间用户还是什么都不能做,因为progress service会首先显示一个busy的光标,然后如果在一段时间内工作还没有完成,则会显示出一个进度对话框!对于这个问题:这里还有一种选择就是使用:WorkspaceJob。一般使用示例如下:
final IFile[] files = getSelectedFiles();
WorkspaceJob job = new WorkspaceJob("Modify some files") {
public IStatus runInWorkspace(IProgressMonitor monitor)
throws CoreException {
for (int i = 0; i < files.length; i++) {
files[i].setContents(
modifyContents(files[i].getContents()), false,
true, monitor);
}
return Status.OK_STATUS;
}
};
job.setRule(modifyRule(files));
job.schedule();
它类似于IWorkspace,不过它的好处就是可以在后台运行!可以允许用户执行其他任务。不好之处就是:与给一个对话框相比,提供回显给用户是更复杂的!
- 描述: 图三
- 大小: 9.7 KB
- 描述: 图四
- 大小: 7 KB
分享到:
相关推荐
### Sqoop2 Java API从Oracle导数据到HDFS开发总结 #### 整体说明与准备工作 本文档旨在帮助读者理解如何使用Sqoop2的Java API将数据从Oracle数据库迁移至Hadoop分布式文件系统(HDFS)。为了顺利完成这一过程,本...
案例中使用的版本为jBPM-JPDL3.2.2。 - **下载地址**: [http://labs.jboss.com/jbossjbpm/jbpm_downloads/](http://labs.jboss.com/jbossjbpm/jbpm_downloads/) - **下载内容**: jPDL Suite版,该版本包含了完整的...
标题“使用Eclipse连接Hadoop”意味着我们要探讨的是如何在流行的Java开发环境Eclipse中配置和使用Hadoop相关的工具,以便开发和调试MapReduce程序。Hadoop是一个分布式计算框架,而Eclipse则是一个广泛用于Java开发...
通过导入这些文件到你的IDE(如IntelliJ IDEA或Eclipse),你可以运行这个示例,了解如何在实际项目中使用Kettle API。 总之,通过Java Kettle API,开发者可以将Pentaho Data Integration的功能无缝集成到Java应用...
例如,一个简单的Job实现可能如下: ```java import org.quartz.Job; import org.quartz.JobDataMap; import org.quartz.JobExecutionContext; import org.quartz.JobExecutionException; public class ...
4. **文档和教程**:为了帮助用户理解如何在Kettle中使用MQTT,压缩包可能包含详细的操作指南、API参考或者示例工作流,说明如何创建和配置MQTT连接,以及如何在ETL过程中使用MQTT数据源和目标。 5. **示例项目**:...
Hadoop Idea插件是专门为开发者设计的,旨在提供在Idea中直接操作和管理Hadoop集群的功能,类似于Eclipse中的HDFS插件,使得开发和调试Hadoop应用程序更为便捷。 安装Hadoop Idea插件的过程如下: 1. 打开IntelliJ...
例如,它可能指导学生如何设置Java开发环境(JDK),如何使用集成开发环境(IDE)如IntelliJ IDEA或Eclipse,以及如何运行和理解`main.java`中的代码示例。 在大数据处理方面,Java以其强类型、面向对象的特性,...
在 IDE(如 IntelliJ IDEA 或 Eclipse)中,选择“新建项目”并选择 Maven 项目模板。填写项目的 Group ID、Artifact ID 和 Version,这些信息将定义项目的唯一标识。 接着,我们需要在项目的 `pom.xml` 文件中添加...
2. **修改 pom.xml 文件**:在 `pom.xml` 文件中添加 Smart 框架的依赖。 3. **修改 web.xml 文件**:配置 Web 应用的基本设置。 4. **新增 config.properties 文件**:配置应用的基本属性。 5. **新增 log4j....