java - 在 IntelliJ 插件中创建后台任务

标签 java intellij-idea intellij-plugin

我正在开发一个 IntelliJ-idea 插件并希望在后台任务中运行代码(在后台任务对话框和 UI 之外的另一个线程中可见)。

我找到了以下 Helper class并通过传递一个 Runnable 对象并实现它的 run 方法来尝试它,但它仍然阻塞 UI,当我尝试自己执行线程时,我收到以下错误

 Read access is allowed from event dispatch thread or inside read-action only (see com.intellij.openapi.application.Application.runReadAction())
     Details: Current thread: Thread[Thread-69 [WriteAccessToken],6,Idea Thread Group] 532224832
     Our dispatch thread:Thread[AWT-EventQueue-1 12.1.4#IU-129.713, eap:false,6,Idea Thread Group] 324031064
     SystemEventQueueThread: Thread[AWT-EventQueue-1 12.1.4#IU-129.713, eap:false,6,Idea Thread Group] 324031064

最佳答案

我找到了一种更好的方法来将进程作为后台任务运行,您可以在其中更新进度条百分比和文本

ProgressManager.getInstance().run(new Task.Backgroundable(project, "Title"){
        public void run(@NotNull ProgressIndicator progressIndicator) {

            // start your process

            // Set the progress bar percentage and text
            progressIndicator.setFraction(0.10);
            progressIndicator.setText("90% to finish");


            // 50% done
            progressIndicator.setFraction(0.50);
            progressIndicator.setText("50% to finish");


            // Finished
            progressIndicator.setFraction(1.0);
            progressIndicator.setText("finished");

        }});

如果你需要从另一个线程读取一些数据,你应该使用

AccessToken token = null;
try {
   token = ApplicationManager.getApplication().acquireReadActionLock();
                    //do what you need
} finally {
   token.finish();
}

关于java - 在 IntelliJ 插件中创建后台任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18725340/

相关文章:

java - 强制 Java 虚拟机运行垃圾收集器

java - 内存不足 java 堆大小

intellij-idea - 使用 Gradle 和 IntelliJ 管理项目依赖项

java - 如何以编程方式执行 Java IDE 对方法引用的搜索?

intellij-idea - 添加自定义代码生成器

java - 如何在 Eclipse 上设置 Java Opengl?

java - 图像下载应考虑哪种协议(protocol) HTTPp 与 FTp

java - 从 CheckStyle 中的方法计数中排除 getter 和 setter

斯卡拉-IntelliJ : Simple Module w/Scala SDK vs SBT-based

Android Studio 3.5.2 - Marketplace 插件未加载