Make sure AndroidRendererFrontend exists when accessing it (#3522)

This commit is contained in:
Bart Louwers
2025-06-04 18:40:50 +02:00
committed by GitHub
parent b11134a301
commit 47605a92fa
4 changed files with 29 additions and 10 deletions

View File

@@ -91,13 +91,24 @@ private:
ActorRef<RendererObserver> delegate;
};
AndroidRendererFrontend::AndroidRendererFrontend(MapRenderer& mapRenderer_)
AndroidRendererFrontend::AndroidRendererFrontend(Private, MapRenderer& mapRenderer_)
: mapRenderer(mapRenderer_),
mapRunLoop(util::RunLoop::Get()),
updateAsyncTask(std::make_unique<util::AsyncTask>([this]() {
mapRenderer.update(std::move(updateParams));
mapRenderer.requestRender();
})) {}
mapRunLoop(util::RunLoop::Get()) {}
std::shared_ptr<AndroidRendererFrontend> AndroidRendererFrontend::create(MapRenderer& mapRenderer) {
auto ptr = std::make_shared<AndroidRendererFrontend>(Private(), mapRenderer);
ptr->init();
return ptr;
}
void AndroidRendererFrontend::init() {
updateAsyncTask = std::make_unique<util::AsyncTask>([weakSelf = weak_from_this()]() {
if (auto self = weakSelf.lock()) {
self->mapRenderer.update(std::move(self->updateParams));
self->mapRenderer.requestRender();
}
});
}
AndroidRendererFrontend::~AndroidRendererFrontend() = default;

View File

@@ -27,9 +27,17 @@ class AsyncTask;
namespace android {
class AndroidRendererFrontend : public RendererFrontend {
class AndroidRendererFrontend : public RendererFrontend, public std::enable_shared_from_this<AndroidRendererFrontend> {
struct Private {
explicit Private() = default;
};
public:
AndroidRendererFrontend(MapRenderer&);
AndroidRendererFrontend(Private, MapRenderer&);
static std::shared_ptr<AndroidRendererFrontend> create(MapRenderer&);
void init();
~AndroidRendererFrontend() override;
void reset() override;

View File

@@ -75,7 +75,7 @@ NativeMapView::NativeMapView(jni::JNIEnv& _env,
}
// Create a renderer frontend
rendererFrontend = std::make_unique<AndroidRendererFrontend>(mapRenderer);
rendererFrontend = AndroidRendererFrontend::create(mapRenderer);
// Create Map options
MapOptions options;

View File

@@ -345,7 +345,7 @@ public:
void onSpriteRequested(const std::optional<mbgl::style::Sprite>&) override;
private:
std::unique_ptr<AndroidRendererFrontend> rendererFrontend;
std::shared_ptr<AndroidRendererFrontend> rendererFrontend;
JavaVM* vm = nullptr;
jni::WeakReference<jni::Object<NativeMapView>> javaPeer;