From 825afa273b6826cc4b194f1c240a869c4f99e6d0 Mon Sep 17 00:00:00 2001 From: WonYoung Choi Date: Tue, 31 May 2016 13:02:30 +0900 Subject: [PATCH] Add callbacks as private member of class to prevent GC deletators Change-Id: I78b860e717a6e19a32d2f534605187ec41eea23c --- .../Tizen.Applications/Application.cs | 14 ++++- .../Tizen.Applications/ServiceApplication.cs | 45 ++++++++++------ .../Tizen.Applications/UIApplication.cs | 62 +++++++++++++--------- 3 files changed, 78 insertions(+), 43 deletions(-) diff --git a/Tizen.Applications/Tizen.Applications/Application.cs b/Tizen.Applications/Tizen.Applications/Application.cs index 99c22d7..e60a096 100644 --- a/Tizen.Applications/Tizen.Applications/Application.cs +++ b/Tizen.Applications/Tizen.Applications/Application.cs @@ -24,12 +24,22 @@ namespace Tizen.Applications private Interop.AppEvent.SafeAppEventHandle _lowMemoryNativeHandle; private Interop.AppEvent.SafeAppEventHandle _localeChangedNativeHandle; + private Interop.AppEvent.AppEventCallback _appEventCallback; + private object _lock = new object(); private DirectoryInfo _directoryInfo; private ApplicationInfo _applicationInfo; /// + /// Initializes Application instance. + /// + public Application() + { + _appEventCallback = new Interop.AppEvent.AppEventCallback(HandleAppEvent); + } + + /// /// Occurs when the application is launched. /// public event EventHandler Created; @@ -113,8 +123,8 @@ namespace Tizen.Applications s_CurrentApplication = this; - Interop.AppEvent.AddEventHandler(Interop.AppEvent.EventNames.LowMemory, HandleAppEvent, IntPtr.Zero, out _lowMemoryNativeHandle); - Interop.AppEvent.AddEventHandler(Interop.AppEvent.EventNames.LanguageSet, HandleAppEvent, IntPtr.Zero, out _localeChangedNativeHandle); + Interop.AppEvent.AddEventHandler(Interop.AppEvent.EventNames.LowMemory, _appEventCallback, IntPtr.Zero, out _lowMemoryNativeHandle); + Interop.AppEvent.AddEventHandler(Interop.AppEvent.EventNames.LanguageSet, _appEventCallback, IntPtr.Zero, out _localeChangedNativeHandle); } /// diff --git a/Tizen.Applications/Tizen.Applications/ServiceApplication.cs b/Tizen.Applications/Tizen.Applications/ServiceApplication.cs index 9f2f7e6..10b6aea 100644 --- a/Tizen.Applications/Tizen.Applications/ServiceApplication.cs +++ b/Tizen.Applications/Tizen.Applications/ServiceApplication.cs @@ -15,6 +15,18 @@ namespace Tizen.Applications /// public class ServiceApplication : Application { + private Interop.Service.ServiceAppLifecycleCallbacks _callbacks; + + /// + /// Initializes ServiceApplication class. + /// + public ServiceApplication() + { + _callbacks.OnCreate = new Interop.Service.ServiceAppCreateCallback(OnCreateNative); + _callbacks.OnTerminate = new Interop.Service.ServiceAppTerminateCallback(OnTerminateNative); + _callbacks.OnAppControl = new Interop.Service.ServiceAppControlCallback(OnAppControlNative); + } + /// /// Runs the service application's main loop. /// @@ -23,23 +35,8 @@ namespace Tizen.Applications { base.Run(args); - Interop.Service.ServiceAppLifecycleCallbacks ops; - ops.OnCreate = (data) => - { - OnCreate(); - return true; - }; - ops.OnTerminate = (data) => - { - OnTerminate(); - }; - ops.OnAppControl = (appControlHandle, data) => - { - OnAppControlReceived(new AppControlReceivedEventArgs { ReceivedAppControl = new ReceivedAppControl(appControlHandle) }); - }; - TizenSynchronizationContext.Initialize(); - Interop.Service.Main(args.Length, args, ref ops, IntPtr.Zero); + Interop.Service.Main(args.Length, args, ref _callbacks, IntPtr.Zero); } /// @@ -49,5 +46,21 @@ namespace Tizen.Applications { Interop.Service.Exit(); } + + private bool OnCreateNative(IntPtr data) + { + OnCreate(); + return true; + } + + private void OnTerminateNative(IntPtr data) + { + OnTerminate(); + } + + private void OnAppControlNative(IntPtr appControlHandle, IntPtr data) + { + OnAppControlReceived(new AppControlReceivedEventArgs { ReceivedAppControl = new ReceivedAppControl(appControlHandle) }); + } } } diff --git a/Tizen.Applications/Tizen.Applications/UIApplication.cs b/Tizen.Applications/Tizen.Applications/UIApplication.cs index d8db375..170e56b 100644 --- a/Tizen.Applications/Tizen.Applications/UIApplication.cs +++ b/Tizen.Applications/Tizen.Applications/UIApplication.cs @@ -16,6 +16,20 @@ namespace Tizen.Applications /// public class UIApplication : Application { + private Interop.Application.UIAppLifecycleCallbacks _callbacks; + + /// + /// Initializes UIApplication class. + /// + public UIApplication() + { + _callbacks.OnCreate = new Interop.Application.AppCreateCallback(OnCreateNative); + _callbacks.OnTerminate = new Interop.Application.AppTerminateCallback(OnTerminateNative); + _callbacks.OnAppControl = new Interop.Application.AppControlCallback(OnAppControlNative); + _callbacks.OnResume = new Interop.Application.AppResumeCallback(OnResumeNative); + _callbacks.OnPause = new Interop.Application.AppPauseCallback(OnPauseNative); + } + /// /// Occurs whenever the application is resumed. /// @@ -42,31 +56,8 @@ namespace Tizen.Applications { base.Run(args); - Interop.Application.UIAppLifecycleCallbacks ops; - ops.OnCreate = (data) => - { - SendCreate(); - return true; - }; - ops.OnTerminate = (data) => - { - OnTerminate(); - }; - ops.OnAppControl = (appControlHandle, data) => - { - OnAppControlReceived(new AppControlReceivedEventArgs { ReceivedAppControl = new ReceivedAppControl(appControlHandle) }); - }; - ops.OnResume = (data) => - { - OnResume(); - }; - ops.OnPause = (data) => - { - OnPause(); - }; - TizenSynchronizationContext.Initialize(); - Interop.Application.Main(args.Length, args, ref ops, IntPtr.Zero); + Interop.Application.Main(args.Length, args, ref _callbacks, IntPtr.Zero); } /// @@ -95,7 +86,7 @@ namespace Tizen.Applications Paused?.Invoke(this, EventArgs.Empty); } - private void SendCreate() + private bool OnCreateNative(IntPtr data) { Window = new Window("C# UI Application"); Window.Closed += (s, e) => @@ -103,6 +94,27 @@ namespace Tizen.Applications Exit(); }; OnCreate(); + return true; + } + + private void OnTerminateNative(IntPtr data) + { + OnTerminate(); + } + + private void OnAppControlNative(IntPtr appControlHandle, IntPtr data) + { + OnAppControlReceived(new AppControlReceivedEventArgs { ReceivedAppControl = new ReceivedAppControl(appControlHandle) }); + } + + private void OnResumeNative(IntPtr data) + { + OnResume(); + } + + private void OnPauseNative(IntPtr data) + { + OnPause(); } } } -- 2.7.4