diff options
author | Ivo van Dongen <info@ivovandongen.nl> | 2017-09-18 12:31:03 +0300 |
---|---|---|
committer | Ivo van Dongen <info@ivovandongen.nl> | 2017-09-18 12:31:03 +0300 |
commit | d64c07806c1a283a06f58bfea19ee2dfaa52b8b2 (patch) | |
tree | 9f150785e3a77c2cd79e16aa6f4fd0740d61ec66 | |
parent | 13152dcf27d9792468c7cce21568840314e11b09 (diff) | |
download | qtlocation-mapboxgl-d64c07806c1a283a06f58bfea19ee2dfaa52b8b2.tar.gz |
[android] use a actor_ref in the forwarding renderer observer to ensure no messages are sent after the map is destroyed
-rw-r--r-- | platform/android/src/android_renderer_frontend.cpp | 39 |
1 files changed, 16 insertions, 23 deletions
diff --git a/platform/android/src/android_renderer_frontend.cpp b/platform/android/src/android_renderer_frontend.cpp index 7e7eb50f32..b80e23e21f 100644 --- a/platform/android/src/android_renderer_frontend.cpp +++ b/platform/android/src/android_renderer_frontend.cpp @@ -16,49 +16,42 @@ namespace android { // Delegate RendererObserver on the given RunLoop class ForwardingRendererObserver : public RendererObserver { public: - ForwardingRendererObserver(util::RunLoop& mapRunLoop_, RendererObserver& delegate_) - : mapRunLoop(mapRunLoop_) - , delegate(delegate_) {} + ForwardingRendererObserver(util::RunLoop& mapRunLoop, RendererObserver& delegate_) + : mailbox(std::make_shared<Mailbox>(mapRunLoop)) + , delegate(delegate_, mailbox) { + } + + ~ForwardingRendererObserver() { + mailbox->close(); + } void onInvalidate() override { - mapRunLoop.invoke([&]() { - delegate.onInvalidate(); - }); + delegate.invoke(&RendererObserver::onInvalidate); } void onResourceError(std::exception_ptr err) override { - mapRunLoop.invoke([&, err]() { - delegate.onResourceError(err); - }); + delegate.invoke(&RendererObserver::onResourceError, err); } void onWillStartRenderingMap() override { - mapRunLoop.invoke([&]() { - delegate.onWillStartRenderingMap(); - }); + delegate.invoke(&RendererObserver::onWillStartRenderingMap); } void onWillStartRenderingFrame() override { - mapRunLoop.invoke([&]() { - delegate.onWillStartRenderingFrame(); - }); + delegate.invoke(&RendererObserver::onWillStartRenderingFrame); } void onDidFinishRenderingFrame(RenderMode mode, bool repaintNeeded) override { - mapRunLoop.invoke([&, mode, repaintNeeded]() { - delegate.onDidFinishRenderingFrame(mode, repaintNeeded); - }); + delegate.invoke(&RendererObserver::onDidFinishRenderingFrame, mode, repaintNeeded); } void onDidFinishRenderingMap() override { - mapRunLoop.invoke([&]() { - delegate.onDidFinishRenderingMap(); - }); + delegate.invoke(&RendererObserver::onDidFinishRenderingMap); } private: - util::RunLoop& mapRunLoop; - RendererObserver& delegate; + std::shared_ptr<Mailbox> mailbox; + ActorRef<RendererObserver> delegate; }; AndroidRendererFrontend::AndroidRendererFrontend(MapRenderer& mapRenderer_) |