mirror of
https://gitee.com/zhangsken/AndroidIDE.git
synced 2026-10-16 07:49:44 +08:00
fix: ToolingServerListener is not released properly, resulting in memory leak
This commit is contained in:
@@ -135,7 +135,7 @@ abstract class ProjectHandlerActivity : BaseEditorActivity(), IProjectHandler {
|
||||
|
||||
override fun preDestroy() {
|
||||
if (isDestroying) {
|
||||
|
||||
releaseServerListener()
|
||||
this.initializingFuture?.cancel(true)
|
||||
this.initializingFuture = null
|
||||
|
||||
@@ -254,6 +254,8 @@ abstract class ProjectHandlerActivity : BaseEditorActivity(), IProjectHandler {
|
||||
}
|
||||
|
||||
this.initializingFuture!!.whenCompleteAsync { result, error ->
|
||||
releaseServerListener()
|
||||
|
||||
if (result == null || error != null) {
|
||||
log.error("An error occurred initializing the project with Tooling API", error)
|
||||
setStatus(getString(string.msg_project_initialization_failed))
|
||||
@@ -264,6 +266,12 @@ abstract class ProjectHandlerActivity : BaseEditorActivity(), IProjectHandler {
|
||||
}
|
||||
}
|
||||
|
||||
private fun releaseServerListener() {
|
||||
// Release reference to server listener in order to prevent memory leak
|
||||
(Lookup.DEFAULT.lookup(BuildService.KEY_BUILD_SERVICE) as? GradleBuildService?)
|
||||
?.setServerListener(null)
|
||||
}
|
||||
|
||||
override fun stopLanguageServers() {
|
||||
try {
|
||||
destroyLanguageServers(isChangingConfigurations)
|
||||
|
||||
@@ -343,6 +343,12 @@ public class GradleBuildService extends Service implements BuildService, IToolin
|
||||
return gradlew.exists() && gradleWrapperJar.exists() && gradleWrapperProps.exists();
|
||||
}
|
||||
|
||||
public void setServerListener (@Nullable ToolingServerRunner.OnServerStartListener listener) {
|
||||
if (this.toolingServerThread != null) {
|
||||
this.toolingServerThread.setListener(listener);
|
||||
}
|
||||
}
|
||||
|
||||
private CompletableFuture<GradleWrapperCheckResult> installWrapper() {
|
||||
if (eventListener != null) {
|
||||
eventListener.onOutput("-------------------- NOTE --------------------");
|
||||
@@ -478,7 +484,7 @@ public class GradleBuildService extends Service implements BuildService, IToolin
|
||||
if (toolingServerThread.isStarted() && listener != null) {
|
||||
listener.onServerStarted();
|
||||
} else {
|
||||
toolingServerThread.setListener(listener);
|
||||
setServerListener(listener);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -123,8 +123,12 @@ internal class ToolingServerRunner(
|
||||
|
||||
override fun interrupt() {
|
||||
super.interrupt()
|
||||
listener = null
|
||||
observer = null
|
||||
release()
|
||||
}
|
||||
|
||||
internal fun release() {
|
||||
this.listener = null
|
||||
this.observer = null
|
||||
}
|
||||
|
||||
interface Observer {
|
||||
|
||||
Reference in New Issue
Block a user