Add callbacks as private member of class to prevent GC deletators
authorWonYoung Choi <wy80.choi@samsung.com>
Tue, 31 May 2016 04:02:30 +0000 (13:02 +0900)
committerWonYoung Choi <wy80.choi@samsung.com>
Tue, 31 May 2016 04:02:30 +0000 (13:02 +0900)
Change-Id: I78b860e717a6e19a32d2f534605187ec41eea23c

Tizen.Applications/Tizen.Applications/Application.cs
Tizen.Applications/Tizen.Applications/ServiceApplication.cs
Tizen.Applications/Tizen.Applications/UIApplication.cs

index 99c22d7..e60a096 100644 (file)
@@ -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;
 
         /// <summary>
+        /// Initializes Application instance.
+        /// </summary>
+        public Application()
+        {
+            _appEventCallback = new Interop.AppEvent.AppEventCallback(HandleAppEvent);
+        }
+
+        /// <summary>
         /// Occurs when the application is launched.
         /// </summary>
         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);
         }
 
         /// <summary>
index 9f2f7e6..10b6aea 100644 (file)
@@ -15,6 +15,18 @@ namespace Tizen.Applications
     /// </summary>
     public class ServiceApplication : Application
     {
+        private Interop.Service.ServiceAppLifecycleCallbacks _callbacks;
+
+        /// <summary>
+        /// Initializes ServiceApplication class.
+        /// </summary>
+        public ServiceApplication()
+        {
+            _callbacks.OnCreate = new Interop.Service.ServiceAppCreateCallback(OnCreateNative);
+            _callbacks.OnTerminate = new Interop.Service.ServiceAppTerminateCallback(OnTerminateNative);
+            _callbacks.OnAppControl = new Interop.Service.ServiceAppControlCallback(OnAppControlNative);
+        }
+
         /// <summary>
         /// Runs the service application's main loop.
         /// </summary>
@@ -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);
         }
 
         /// <summary>
@@ -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) });
+        }
     }
 }
index d8db375..170e56b 100644 (file)
@@ -16,6 +16,20 @@ namespace Tizen.Applications
     /// </summary>
     public class UIApplication : Application
     {
+        private Interop.Application.UIAppLifecycleCallbacks _callbacks;
+
+        /// <summary>
+        /// Initializes UIApplication class.
+        /// </summary>
+        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);
+        }
+
         /// <summary>
         /// Occurs whenever the application is resumed.
         /// </summary>
@@ -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);
         }
 
         /// <summary>
@@ -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();
         }
     }
 }