Use Application.addListener(listener, disposable)

#KT-35918 Comment
This commit is contained in:
Vladimir Dolzhenko
2020-02-03 14:59:47 +01:00
parent 45e288be49
commit df23274aa5
2 changed files with 21 additions and 14 deletions
@@ -70,7 +70,7 @@ class KotlinBytecodeToolWindow(private val myProject: Project, private val toolW
private val jvm8Target: JCheckBox private val jvm8Target: JCheckBox
private val ir: JCheckBox private val ir: JCheckBox
private inner class UpdateBytecodeToolWindowTask : LongRunningReadTask<Location, BytecodeGenerationResult>() { private inner class UpdateBytecodeToolWindowTask : LongRunningReadTask<Location, BytecodeGenerationResult>(this) {
override fun prepareRequestInfo(): Location? { override fun prepareRequestInfo(): Location? {
if (!toolWindow.isVisible) { if (!toolWindow.isVisible) {
return null return null
@@ -16,13 +16,15 @@
package org.jetbrains.kotlin.idea.util; package org.jetbrains.kotlin.idea.util;
import com.intellij.openapi.Disposable;
import com.intellij.openapi.application.Application; 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.application.ApplicationManager;
import com.intellij.openapi.progress.ProgressIndicator; import com.intellij.openapi.progress.ProgressIndicator;
import com.intellij.openapi.progress.ProgressManager; import com.intellij.openapi.progress.ProgressManager;
import com.intellij.openapi.progress.util.ProgressIndicatorBase; import com.intellij.openapi.progress.util.ProgressIndicatorBase;
import com.intellij.openapi.progress.util.ProgressIndicatorUtils; import com.intellij.openapi.progress.util.ProgressIndicatorUtils;
import com.intellij.openapi.util.Disposer;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
@@ -35,11 +37,14 @@ public abstract class LongRunningReadTask<RequestInfo, ResultData> {
FINISHED_WITH_ACTUAL_DATA FINISHED_WITH_ACTUAL_DATA
} }
private final Disposable parentDisposable;
private ProgressIndicator progressIndicator = null; private ProgressIndicator progressIndicator = null;
private RequestInfo requestInfo = null; private RequestInfo requestInfo = null;
private State currentState = State.NOT_INITIALIZED; private State currentState = State.NOT_INITIALIZED;
protected LongRunningReadTask() {} protected LongRunningReadTask(Disposable disposable) {
parentDisposable = disposable;
}
/** Should be executed in GUI thread */ /** Should be executed in GUI thread */
public boolean shouldStart(@Nullable LongRunningReadTask<RequestInfo, ResultData> previousTask) { public boolean shouldStart(@Nullable LongRunningReadTask<RequestInfo, ResultData> previousTask) {
@@ -102,7 +107,7 @@ public abstract class LongRunningReadTask<RequestInfo, ResultData> {
ApplicationManager.getApplication().executeOnPooledThread(new Runnable() { ApplicationManager.getApplication().executeOnPooledThread(new Runnable() {
@Override @Override
public void run() { public void run() {
runWithWriteActionPriority(progressIndicator, new Runnable() { runWithWriteActionPriority(progressIndicator, parentDisposable, new Runnable() {
@Override @Override
public void run() { public void run() {
ResultData resultData = null; ResultData resultData = null;
@@ -208,10 +213,17 @@ public abstract class LongRunningReadTask<RequestInfo, ResultData> {
* {@link ProgressIndicatorUtils#runWithWriteActionPriority(Runnable)} * {@link ProgressIndicatorUtils#runWithWriteActionPriority(Runnable)}
* *
* @param indicator * @param indicator
* @param parentDisposable
* @param action * @param action
*/ */
public static void runWithWriteActionPriority(@NotNull final ProgressIndicator indicator, @NotNull final Runnable action) { public static void runWithWriteActionPriority(
ApplicationAdapter listener = new ApplicationAdapter() { @NotNull final ProgressIndicator indicator,
@NotNull Disposable parentDisposable,
@NotNull final Runnable action
) {
Disposable disposable = Disposer.newDisposable();
Disposer.register(parentDisposable, disposable);
ApplicationListener listener = new ApplicationListener() {
@Override @Override
public void beforeWriteActionStart(Object action) { public void beforeWriteActionStart(Object action) {
indicator.cancel(); indicator.cancel();
@@ -219,16 +231,11 @@ public abstract class LongRunningReadTask<RequestInfo, ResultData> {
}; };
final Application application = ApplicationManager.getApplication(); final Application application = ApplicationManager.getApplication();
try { try {
application.addApplicationListener(listener); application.addApplicationListener(listener, disposable);
ProgressManager.getInstance().runProcess(new Runnable() { ProgressManager.getInstance().runProcess(() -> application.runReadAction(action), indicator);
@Override
public void run() {
application.runReadAction(action);
}
}, indicator);
} }
finally { finally {
application.removeApplicationListener(listener); Disposer.dispose(disposable);
} }
} }
} }