</pre><pre name="code" class="java">/**
* 该类为解决界面实时校验慢写的,但不限于此,可以执行后台逻辑。<br>
* <br>
* 效果是:<br>
* 在校验触触发结束后一段时间执行最近一次job中的逻辑,废弃之前的<br>
* 逻辑,避免了逻辑随着界面频繁的修改而多次执行导致的资源消耗问题
*
* @author hunan
*/
public abstract class LazyJob
{
/**
* job名称
*/
private String name = "lazy job"; //$NON-NLS-1$
/**
* 已被schedule的oldJob
*/
private Job oldJob = null;
/**
* 当前的job
*/
private Job job = null;
/**
* 是否UIJob
*/
private final boolean isUIJob;
/**
* 构造函数
*
* @param name job名称
* @param isUIJob 是否为UIJob,如果是执行界面逻辑传true
*/
protected LazyJob(String name, boolean isUIJob)
{
this.name = name;
this.isUIJob = isUIJob;
}
/**
* 构造函数
*
* @param isUIJob 是否为UIJob,如果是执行界面逻辑传true
*/
protected LazyJob(boolean isUIJob)
{
this.isUIJob = isUIJob;
}
/**
* @return 获取内部Job,没有则新建
*/
public Job getJob()
{
if (job != null) {
return job;
}
if (isUIJob)
{
return job = new UIJob(name)
{
@Override
public IStatus runInUIThread(IProgressMonitor monitor)
{
if (monitor.isCanceled())
{
return Status.CANCEL_STATUS;
}
return doRun(monitor);
}
};
}
return job = new Job(name)
{
@Override
protected IStatus run(IProgressMonitor monitor)
{
if (monitor.isCanceled())
{
return Status.CANCEL_STATUS;
}
return doRun(monitor);
}
};
}
/**
* 取消Job
*/
private void cancel()
{
if (oldJob != null)
{
oldJob.cancel();
}
}
/**
* 重启job<br>
* 如果之前已经存在job,则取消。新起一个job
*
* @param delay 延迟的时间
*/
public void schedule(final long delay)
{
cancel();
getJob().schedule(delay);
oldJob = job;
job = null;
}
/**
* 子类重写字方法实现具体逻辑
*
* @param monitor
*/
protected abstract IStatus doRun(IProgressMonitor monitor);
};