Use Application.addListener(listener, disposable)
#KT-35918 Comment
This commit is contained in:
@@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user