summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIvo van Dongen <info@ivovandongen.nl>2017-09-18 12:31:03 +0300
committerIvo van Dongen <info@ivovandongen.nl>2017-09-18 12:31:03 +0300
commitd64c07806c1a283a06f58bfea19ee2dfaa52b8b2 (patch)
tree9f150785e3a77c2cd79e16aa6f4fd0740d61ec66
parent13152dcf27d9792468c7cce21568840314e11b09 (diff)
downloadqtlocation-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.cpp39
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_)