From df23274aa5019d6508780e8e212ed724662b43fa Mon Sep 17 00:00:00 2001 From: Vladimir Dolzhenko Date: Mon, 3 Feb 2020 14:59:47 +0100 Subject: [PATCH] Use Application.addListener(listener, disposable) #KT-35918 Comment --- .../idea/internal/KotlinBytecodeToolWindow.kt | 2 +- .../kotlin/idea/util/LongRunningReadTask.java | 33 +++++++++++-------- 2 files changed, 21 insertions(+), 14 deletions(-) diff --git a/idea/idea-jvm/src/org/jetbrains/kotlin/idea/internal/KotlinBytecodeToolWindow.kt b/idea/idea-jvm/src/org/jetbrains/kotlin/idea/internal/KotlinBytecodeToolWindow.kt index 8b3a56287e0..ac6094895f7 100644 --- a/idea/idea-jvm/src/org/jetbrains/kotlin/idea/internal/KotlinBytecodeToolWindow.kt +++ b/idea/idea-jvm/src/org/jetbrains/kotlin/idea/internal/KotlinBytecodeToolWindow.kt @@ -70,7 +70,7 @@ class KotlinBytecodeToolWindow(private val myProject: Project, private val toolW private val jvm8Target: JCheckBox private val ir: JCheckBox - private inner class UpdateBytecodeToolWindowTask : LongRunningReadTask() { + private inner class UpdateBytecodeToolWindowTask : LongRunningReadTask(this) { override fun prepareRequestInfo(): Location? { if (!toolWindow.isVisible) { return null diff --git a/idea/src/org/jetbrains/kotlin/idea/util/LongRunningReadTask.java b/idea/src/org/jetbrains/kotlin/idea/util/LongRunningReadTask.java index 7c6f3e83bf2..4a327ad080f 100644 --- a/idea/src/org/jetbrains/kotlin/idea/util/LongRunningReadTask.java +++ b/idea/src/org/jetbrains/kotlin/idea/util/LongRunningReadTask.java @@ -16,13 +16,15 @@ package org.jetbrains.kotlin.idea.util; +import com.intellij.openapi.Disposable; import com.intellij.openapi.application.Application; -import com.intellij.openapi.application.ApplicationAdapter; +import com.intellij.openapi.application.ApplicationListener; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.progress.ProgressIndicator; import com.intellij.openapi.progress.ProgressManager; import com.intellij.openapi.progress.util.ProgressIndicatorBase; import com.intellij.openapi.progress.util.ProgressIndicatorUtils; +import com.intellij.openapi.util.Disposer; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -35,11 +37,14 @@ public abstract class LongRunningReadTask { FINISHED_WITH_ACTUAL_DATA } + private final Disposable parentDisposable; private ProgressIndicator progressIndicator = null; private RequestInfo requestInfo = null; private State currentState = State.NOT_INITIALIZED; - protected LongRunningReadTask() {} + protected LongRunningReadTask(Disposable disposable) { + parentDisposable = disposable; + } /** Should be executed in GUI thread */ public boolean shouldStart(@Nullable LongRunningReadTask previousTask) { @@ -102,7 +107,7 @@ public abstract class LongRunningReadTask { ApplicationManager.getApplication().executeOnPooledThread(new Runnable() { @Override public void run() { - runWithWriteActionPriority(progressIndicator, new Runnable() { + runWithWriteActionPriority(progressIndicator, parentDisposable, new Runnable() { @Override public void run() { ResultData resultData = null; @@ -208,10 +213,17 @@ public abstract class LongRunningReadTask { * {@link ProgressIndicatorUtils#runWithWriteActionPriority(Runnable)} * * @param indicator + * @param parentDisposable * @param action */ - public static void runWithWriteActionPriority(@NotNull final ProgressIndicator indicator, @NotNull final Runnable action) { - ApplicationAdapter listener = new ApplicationAdapter() { + public static void runWithWriteActionPriority( + @NotNull final ProgressIndicator indicator, + @NotNull Disposable parentDisposable, + @NotNull final Runnable action + ) { + Disposable disposable = Disposer.newDisposable(); + Disposer.register(parentDisposable, disposable); + ApplicationListener listener = new ApplicationListener() { @Override public void beforeWriteActionStart(Object action) { indicator.cancel(); @@ -219,16 +231,11 @@ public abstract class LongRunningReadTask { }; final Application application = ApplicationManager.getApplication(); try { - application.addApplicationListener(listener); - ProgressManager.getInstance().runProcess(new Runnable() { - @Override - public void run() { - application.runReadAction(action); - } - }, indicator); + application.addApplicationListener(listener, disposable); + ProgressManager.getInstance().runProcess(() -> application.runReadAction(action), indicator); } finally { - application.removeApplicationListener(listener); + Disposer.dispose(disposable); } } }