Browse Source
Added timer subscriptions for views.
pull/5337/head
José Pedro
5 years ago
No known key found for this signature in database
GPG Key ID: B8247B9301707B83
2 changed files with
36 additions and
1 deletions
-
src/Android/Avalonia.Android/AvaloniaView.cs
-
src/Android/Avalonia.Android/ChoreographerTimer.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(); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
@ -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); |
|
|
|
} |
|
|
|
|