Browse Source

Added timer subscriptions for views.

pull/5337/head
José Pedro 5 years ago
parent
commit
b9a2f76cf0
No known key found for this signature in database GPG Key ID: B8247B9301707B83
  1. 8
      src/Android/Avalonia.Android/AvaloniaView.cs
  2. 29
      src/Android/Avalonia.Android/ChoreographerTimer.cs

8
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<IRenderTimer>() is ChoreographerTimer timer)
{
_timerSubscription = timer.SubscribeView(this);
}
_root.Renderer.Start();
}
else
{
_root.Renderer.Stop();
_timerSubscription?.Dispose();
}
}

29
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> _choreographer = new TaskCompletionSource<Choreographer>();
private readonly ISet<AvaloniaView> _views = new HashSet<AvaloniaView>();
private Action<TimeSpan> _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);
}

Loading…
Cancel
Save