From b9a2f76cf0bcbb49e9bab5a50f00de8789c2e9e8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Pedro?= Date: Wed, 10 Feb 2021 23:58:51 +0000 Subject: [PATCH] Added timer subscriptions for views. --- src/Android/Avalonia.Android/AvaloniaView.cs | 8 +++++ .../Avalonia.Android/ChoreographerTimer.cs | 29 ++++++++++++++++++- 2 files changed, 36 insertions(+), 1 deletion(-) diff --git a/src/Android/Avalonia.Android/AvaloniaView.cs b/src/Android/Avalonia.Android/AvaloniaView.cs index a60a17d08e..8de3657283 100644 --- a/src/Android/Avalonia.Android/AvaloniaView.cs +++ b/src/Android/Avalonia.Android/AvaloniaView.cs @@ -15,6 +15,8 @@ namespace Avalonia.Android private readonly EmbeddableControlRoot _root; private readonly ViewImpl _view; + private IDisposable? _timerSubscription; + public AvaloniaView(Context context) : base(context) { _view = new ViewImpl(context); @@ -50,11 +52,17 @@ namespace Avalonia.Android { if (isVisible) { + if (AvaloniaLocator.Current.GetService() is ChoreographerTimer timer) + { + _timerSubscription = timer.SubscribeView(this); + } + _root.Renderer.Start(); } else { _root.Renderer.Stop(); + _timerSubscription?.Dispose(); } } diff --git a/src/Android/Avalonia.Android/ChoreographerTimer.cs b/src/Android/Avalonia.Android/ChoreographerTimer.cs index 12961fec83..1d898261a3 100644 --- a/src/Android/Avalonia.Android/ChoreographerTimer.cs +++ b/src/Android/Avalonia.Android/ChoreographerTimer.cs @@ -1,4 +1,6 @@ using System; +using System.Collections.Generic; +using System.Reactive.Disposables; using System.Threading.Tasks; using Android.OS; @@ -17,6 +19,8 @@ namespace Avalonia.Android private readonly Thread _thread; private readonly TaskCompletionSource _choreographer = new TaskCompletionSource(); + private readonly ISet _views = new HashSet(); + private Action _tick; private int _count; @@ -51,6 +55,29 @@ namespace Avalonia.Android } } + internal IDisposable SubscribeView(AvaloniaView view) + { + lock (_lock) + { + _views.Add(view); + + if (_views.Count == 1) + { + _choreographer.Task.Result.PostFrameCallback(this); + } + } + + return Disposable.Create( + () => + { + lock (_lock) + { + _views.Remove(view); + } + } + ); + } + private void Loop() { Looper.Prepare(); @@ -64,7 +91,7 @@ namespace Avalonia.Android lock (_lock) { - if (_count > 0) + if (_count > 0 && _views.Count > 0) { Choreographer.Instance.PostFrameCallback(this); }