From 512e02410b402aaba806e11535d868b8e9db8448 Mon Sep 17 00:00:00 2001 From: Adrian Cojocaru Date: Mon, 27 Oct 2025 17:04:24 +0200 Subject: [PATCH] Fix `requestRenderAndNotify` continuous callback (#3913) --- .../surfaceview/MapLibreSurfaceView.java | 12 +++++++++-- .../surfaceview/MapLibreGLSurfaceView.java | 17 +++++++++------- .../MapLibreVulkanSurfaceView.java | 20 +++++++++++-------- 3 files changed, 32 insertions(+), 17 deletions(-) diff --git a/platform/android/MapLibreAndroid/src/main/java/org/maplibre/android/maps/renderer/surfaceview/MapLibreSurfaceView.java b/platform/android/MapLibreAndroid/src/main/java/org/maplibre/android/maps/renderer/surfaceview/MapLibreSurfaceView.java index d36acb678..04acbc50f 100644 --- a/platform/android/MapLibreAndroid/src/main/java/org/maplibre/android/maps/renderer/surfaceview/MapLibreSurfaceView.java +++ b/platform/android/MapLibreAndroid/src/main/java/org/maplibre/android/maps/renderer/surfaceview/MapLibreSurfaceView.java @@ -334,7 +334,15 @@ public abstract class MapLibreSurfaceView extends SurfaceView implements Surface wantRenderNotification = true; requestRender = true; renderComplete = false; - finishDrawingRunnable = finishDrawing; + final Runnable oldCallback = finishDrawingRunnable; + finishDrawingRunnable = () -> { + if (oldCallback != null) { + oldCallback.run(); + } + if (finishDrawing != null) { + finishDrawing.run(); + } + }; renderThreadManager.notifyAll(); } @@ -490,7 +498,7 @@ public abstract class MapLibreSurfaceView extends SurfaceView implements Surface protected ArrayList eventQueue = new ArrayList<>(); protected boolean sizeChanged = true; protected Runnable finishDrawingRunnable = null; - protected RenderThreadManager renderThreadManager = null; + protected final RenderThreadManager renderThreadManager; // End of member variables protected by the sRenderThreadManager monitor. } diff --git a/platform/android/MapLibreAndroid/src/opengl/java/org/maplibre/android/maps/renderer/surfaceview/MapLibreGLSurfaceView.java b/platform/android/MapLibreAndroid/src/opengl/java/org/maplibre/android/maps/renderer/surfaceview/MapLibreGLSurfaceView.java index 301e3197e..95dc270d3 100644 --- a/platform/android/MapLibreAndroid/src/opengl/java/org/maplibre/android/maps/renderer/surfaceview/MapLibreGLSurfaceView.java +++ b/platform/android/MapLibreAndroid/src/opengl/java/org/maplibre/android/maps/renderer/surfaceview/MapLibreGLSurfaceView.java @@ -310,7 +310,7 @@ public class MapLibreGLSurfaceView extends MapLibreSurfaceView { return function + " failed: " + EGLLogWrapper.getErrorString(error); } - private WeakReference mGLSurfaceViewWeakRef; + private final WeakReference mGLSurfaceViewWeakRef; EGL10 mEgl; EGLDisplay mEglDisplay; EGLSurface mEglSurface; @@ -561,14 +561,17 @@ public class MapLibreGLSurfaceView extends MapLibreSurfaceView { sizeChanged = false; } - MapLibreSurfaceView view = mSurfaceViewWeakRef.get(); - if (view != null) { - view.renderer.onDrawFrame(); - if (finishDrawingRunnable != null) { - finishDrawingRunnable.run(); - finishDrawingRunnable = null; + { + MapLibreSurfaceView view = mSurfaceViewWeakRef.get(); + if (view != null) { + view.renderer.onDrawFrame(); + if (finishDrawingRunnable != null) { + finishDrawingRunnable.run(); + finishDrawingRunnable = null; + } } } + int swapError = eglHelper.swap(); switch (swapError) { case EGL10.EGL_SUCCESS: diff --git a/platform/android/MapLibreAndroid/src/vulkan/java/org/maplibre/android/maps/renderer/surfaceview/MapLibreVulkanSurfaceView.java b/platform/android/MapLibreAndroid/src/vulkan/java/org/maplibre/android/maps/renderer/surfaceview/MapLibreVulkanSurfaceView.java index 433dbae4e..a4382fea5 100644 --- a/platform/android/MapLibreAndroid/src/vulkan/java/org/maplibre/android/maps/renderer/surfaceview/MapLibreVulkanSurfaceView.java +++ b/platform/android/MapLibreAndroid/src/vulkan/java/org/maplibre/android/maps/renderer/surfaceview/MapLibreVulkanSurfaceView.java @@ -129,9 +129,8 @@ public class MapLibreVulkanSurfaceView extends MapLibreSurfaceView { continue; } - MapLibreVulkanSurfaceView view = mSurfaceViewWeakRef.get(); - if (destroySurface) { + MapLibreVulkanSurfaceView view = mSurfaceViewWeakRef.get(); if (view != null) { view.renderer.onSurfaceDestroyed(); destroySurface = false; @@ -140,6 +139,7 @@ public class MapLibreVulkanSurfaceView extends MapLibreSurfaceView { } if (initSurface) { + MapLibreVulkanSurfaceView view = mSurfaceViewWeakRef.get(); if (view != null) { view.renderer.onSurfaceCreated(view.getHolder().getSurface()); initSurface = false; @@ -147,17 +147,21 @@ public class MapLibreVulkanSurfaceView extends MapLibreSurfaceView { } if (sizeChanged) { + MapLibreVulkanSurfaceView view = mSurfaceViewWeakRef.get(); if (view != null) { view.renderer.onSurfaceChanged(w, h); sizeChanged = false; } } - if (view != null) { - view.renderer.onDrawFrame(); - if (finishDrawingRunnable != null) { - finishDrawingRunnable.run(); - finishDrawingRunnable = null; + { + MapLibreVulkanSurfaceView view = mSurfaceViewWeakRef.get(); + if (view != null) { + view.renderer.onDrawFrame(); + if (finishDrawingRunnable != null) { + finishDrawingRunnable.run(); + finishDrawingRunnable = null; + } } } @@ -170,6 +174,6 @@ public class MapLibreVulkanSurfaceView extends MapLibreSurfaceView { private boolean graphicsSurfaceCreated; - private WeakReference mSurfaceViewWeakRef; + private final WeakReference mSurfaceViewWeakRef; } }