diff --git a/platform/android/MapLibreAndroid/src/cpp/android_renderer_frontend.cpp b/platform/android/MapLibreAndroid/src/cpp/android_renderer_frontend.cpp index 988dff420..6ecc42981 100644 --- a/platform/android/MapLibreAndroid/src/cpp/android_renderer_frontend.cpp +++ b/platform/android/MapLibreAndroid/src/cpp/android_renderer_frontend.cpp @@ -91,13 +91,24 @@ private: ActorRef delegate; }; -AndroidRendererFrontend::AndroidRendererFrontend(MapRenderer& mapRenderer_) +AndroidRendererFrontend::AndroidRendererFrontend(Private, MapRenderer& mapRenderer_) : mapRenderer(mapRenderer_), - mapRunLoop(util::RunLoop::Get()), - updateAsyncTask(std::make_unique([this]() { - mapRenderer.update(std::move(updateParams)); - mapRenderer.requestRender(); - })) {} + mapRunLoop(util::RunLoop::Get()) {} + +std::shared_ptr AndroidRendererFrontend::create(MapRenderer& mapRenderer) { + auto ptr = std::make_shared(Private(), mapRenderer); + ptr->init(); + return ptr; +} + +void AndroidRendererFrontend::init() { + updateAsyncTask = std::make_unique([weakSelf = weak_from_this()]() { + if (auto self = weakSelf.lock()) { + self->mapRenderer.update(std::move(self->updateParams)); + self->mapRenderer.requestRender(); + } + }); +} AndroidRendererFrontend::~AndroidRendererFrontend() = default; diff --git a/platform/android/MapLibreAndroid/src/cpp/android_renderer_frontend.hpp b/platform/android/MapLibreAndroid/src/cpp/android_renderer_frontend.hpp index 2eb325c9c..3210634fa 100644 --- a/platform/android/MapLibreAndroid/src/cpp/android_renderer_frontend.hpp +++ b/platform/android/MapLibreAndroid/src/cpp/android_renderer_frontend.hpp @@ -27,9 +27,17 @@ class AsyncTask; namespace android { -class AndroidRendererFrontend : public RendererFrontend { +class AndroidRendererFrontend : public RendererFrontend, public std::enable_shared_from_this { + struct Private { + explicit Private() = default; + }; + public: - AndroidRendererFrontend(MapRenderer&); + AndroidRendererFrontend(Private, MapRenderer&); + + static std::shared_ptr create(MapRenderer&); + void init(); + ~AndroidRendererFrontend() override; void reset() override; diff --git a/platform/android/MapLibreAndroid/src/cpp/native_map_view.cpp b/platform/android/MapLibreAndroid/src/cpp/native_map_view.cpp index 7fccd8814..c62cad5ff 100644 --- a/platform/android/MapLibreAndroid/src/cpp/native_map_view.cpp +++ b/platform/android/MapLibreAndroid/src/cpp/native_map_view.cpp @@ -75,7 +75,7 @@ NativeMapView::NativeMapView(jni::JNIEnv& _env, } // Create a renderer frontend - rendererFrontend = std::make_unique(mapRenderer); + rendererFrontend = AndroidRendererFrontend::create(mapRenderer); // Create Map options MapOptions options; diff --git a/platform/android/MapLibreAndroid/src/cpp/native_map_view.hpp b/platform/android/MapLibreAndroid/src/cpp/native_map_view.hpp index 045b20c57..f9a0c7a3e 100644 --- a/platform/android/MapLibreAndroid/src/cpp/native_map_view.hpp +++ b/platform/android/MapLibreAndroid/src/cpp/native_map_view.hpp @@ -345,7 +345,7 @@ public: void onSpriteRequested(const std::optional&) override; private: - std::unique_ptr rendererFrontend; + std::shared_ptr rendererFrontend; JavaVM* vm = nullptr; jni::WeakReference> javaPeer;