From 8100cd3571ad4700d324dbeb393b69d6b450c9de Mon Sep 17 00:00:00 2001 From: Max Katz Date: Sat, 6 Aug 2022 21:39:59 -0400 Subject: [PATCH 1/2] Optimize CurrentThreadIsLoopThread on android backend --- .../AndroidThreadingInterface.cs | 17 ++++++++++++++++- .../Avalonia.Android/Avalonia.Android.csproj | 2 +- 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/src/Android/Avalonia.Android/AndroidThreadingInterface.cs b/src/Android/Avalonia.Android/AndroidThreadingInterface.cs index e72f0aed90..abc7947f38 100644 --- a/src/Android/Avalonia.Android/AndroidThreadingInterface.cs +++ b/src/Android/Avalonia.Android/AndroidThreadingInterface.cs @@ -14,6 +14,7 @@ namespace Avalonia.Android internal sealed class AndroidThreadingInterface : IPlatformThreadingInterface { private Handler _handler; + private static Thread s_uiThread; public AndroidThreadingInterface() { @@ -76,7 +77,21 @@ namespace Avalonia.Android EnsureInvokeOnMainThread(() => Signaled?.Invoke(null)); } - public bool CurrentThreadIsLoopThread => Looper.MainLooper.Thread.Equals(Java.Lang.Thread.CurrentThread()); + public bool CurrentThreadIsLoopThread + { + get + { + if (s_uiThread != null) + return s_uiThread == Thread.CurrentThread; + + if (Looper.MainLooper.IsCurrentThread) + { + s_uiThread = Thread.CurrentThread; + return true; + } + return false; + } + } public event Action Signaled; } } diff --git a/src/Android/Avalonia.Android/Avalonia.Android.csproj b/src/Android/Avalonia.Android/Avalonia.Android.csproj index 6688dde8f5..082ba1f647 100644 --- a/src/Android/Avalonia.Android/Avalonia.Android.csproj +++ b/src/Android/Avalonia.Android/Avalonia.Android.csproj @@ -1,7 +1,7 @@  net6.0-android - 21 + 23 true true portable From 0e733c70a16e8e465f2691800aed1a350c9fdf47 Mon Sep 17 00:00:00 2001 From: Max Katz Date: Sat, 6 Aug 2022 22:48:59 -0400 Subject: [PATCH 2/2] Support 21 api --- src/Android/Avalonia.Android/AndroidThreadingInterface.cs | 6 +++++- src/Android/Avalonia.Android/Avalonia.Android.csproj | 2 +- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/src/Android/Avalonia.Android/AndroidThreadingInterface.cs b/src/Android/Avalonia.Android/AndroidThreadingInterface.cs index abc7947f38..42f75a27e1 100644 --- a/src/Android/Avalonia.Android/AndroidThreadingInterface.cs +++ b/src/Android/Avalonia.Android/AndroidThreadingInterface.cs @@ -84,11 +84,15 @@ namespace Avalonia.Android if (s_uiThread != null) return s_uiThread == Thread.CurrentThread; - if (Looper.MainLooper.IsCurrentThread) + var isOnMainThread = OperatingSystem.IsAndroidVersionAtLeast(23) + ? Looper.MainLooper.IsCurrentThread + : Looper.MainLooper.Thread.Equals(Java.Lang.Thread.CurrentThread()); + if (isOnMainThread) { s_uiThread = Thread.CurrentThread; return true; } + return false; } } diff --git a/src/Android/Avalonia.Android/Avalonia.Android.csproj b/src/Android/Avalonia.Android/Avalonia.Android.csproj index 082ba1f647..6688dde8f5 100644 --- a/src/Android/Avalonia.Android/Avalonia.Android.csproj +++ b/src/Android/Avalonia.Android/Avalonia.Android.csproj @@ -1,7 +1,7 @@  net6.0-android - 23 + 21 true true portable