在编辑器上绘制时冻结UI



我正在编写一个Eclipse插件,旨在使Eclipse XML编辑器的行为与Java编辑器类似。所需的功能之一是突出显示所选区域的所有出现(一个单词、一行、一个字符…)。只要你处理小文件,这就很好。

但是,当我开始处理大文件(例如2000行代码)时,UI会在处理高亮显示所需的时间内冻结。这只是1秒或更短的时间,但对用户来说可能非常刺激。当我的听众被触发时,这些"冻结"就会发生,所以:

  • 输入已更改(添加或删除内容)
  • 用户创建一个新的选择(他点击了文档上的某个地方)

我当前启动高亮显示过程的代码如下:

try{
        if (isValidContext(fText, input))
            {
                if (textSelection == null)
                    xmlH = new XMLHighlighter(fText, input);
                else
                    xmlH = new XMLHighlighter(fText, input, textSelection);
                Display.getDefault().asyncExec(new Runnable(){
                    @Override
                    public void run(){
                        try{
                            xmlH.highligth();
                        } catch (Exception e){
                            e.printStackTrace();
                        }
                    }
                });
            }
        } catch (Exception e){
            e.printStackTrace();
    }

我认为运行一个新的Runnable会使这个操作完全独立于同时在UI中执行的其他操作。我错了吗?

我认为这段代码是造成滞后的原因。也许你会另有看法?

感谢阅读。

Display.asyncExec尽快在UI线程中运行Runnable。在这种情况下,当您已经在UI线程中时使用它并不能真正实现任何目标。

必须使用后台线程,或Eclipse JobProgressMonitorDialogIProgressService.run甚至CompleteableFuture在后台运行长时间运行的代码。使用后台代码中的Display.asyncExec来更新UI。

还要注意,Eclipse文本编辑器支持代码提供了一个非常复杂的系统,用于在后台进行语法高亮显示等操作。看看SourceViewerConfigurationIPresentationReconcilerIPartitionTokenScannerIPresentationDamagerIPresentationRepairer等。Eclipse的"新插件项目"向导甚至会使用这些类为您创建XML编辑器的大纲,作为示例之一。

最新更新