【问题标题】:Xamarin iOS: Does the iOS Timer continue at the same spot after going from background back to foregroundXamarin iOS:从后台回到前台后,iOS 计时器是否继续在同一位置
【发布时间】:2017-11-18 14:21:41
【问题描述】:

我在 AppDelegate 内的 FinishLaunching 事件中有一个计时器,该计时器设置为每 30 分钟执行一次。 如果我将应用程序移到后台甚至被设备挂起,我知道定时器会停止,但是如果它回到前台会发生什么。计时器会从它停止的地方继续吗?

例如从应用程序启动 10 分钟后,我切换到应用程序,直到它获得后台/暂停。 10分钟后,我把它换回来。计时器会在 10 分钟后触发还是重新开始(30 分钟)。

   downloadTimer = NSTimer.CreateRepeatingScheduledTimer(30, DownloadEntityFromServer);

    NSRunLoop.Current.AddTimer(downloadTimer, NSRunLoopMode.Default);

【问题讨论】:

    标签: ios xamarin timer nstimer


    【解决方案1】:

    如果应用程序暂停,计时器不会停止。它将继续射击。 没有办法暂停和恢复计时器。相反,请参考以下解决方法来暂停和恢复计时器。

    public partial class AppDelegate : global::Xamarin.Forms.Platform.iOS.FormsApplicationDelegate
        {
            NSTimer downloadTimer;
            DateTime date;
            TimeSpan RemainingMinutes;
            bool isBackground;
            public override bool FinishedLaunching(UIApplication app, NSDictionary options)
            {
                global::Xamarin.Forms.Forms.Init();
                LoadApplication(new App());
                downloadTimer = NSTimer.CreateRepeatingScheduledTimer(new TimeSpan(0,30,0), DownloadEntityFromServer);
                NSRunLoop.Current.AddTimer(downloadTimer, NSRunLoopMode.Default);
                return base.FinishedLaunching(app, options);
            }
    
    
            public override void DidEnterBackground(UIApplication uiApplication)
            {
                RemainingMinutes = (DateTime.Now - date);
                isBackground = true;
                base.DidEnterBackground(uiApplication);
            }
    
            public override void WillEnterForeground(UIApplication uiApplication)
            {
                isBackground = false;
                CreateTemporaryTimer();
                base.WillEnterForeground(uiApplication);
            }
    
            void CreateTemporaryTimer()
            {
               NSTimer tempTimer = NSTimer.CreateScheduledTimer(new TimeSpan(0,30-RemainingMinutes.Minutes,0), TemporaryTimerTicks);
    
            }
    
            void TemporaryTimerTicks(NSTimer obj)
            {
                downloadTimer.Invalidate();
                downloadTimer = NSTimer.CreateRepeatingScheduledTimer(new TimeSpan(0,30,0), DownloadEntityFromServer);
            }
    
            void DownloadEntityFromServer(NSTimer obj)
            {
                date = DateTime.Now;
                if (!isBackground)
                {
                  // Write your stuff
                }
            }
    }
    

    【讨论】:

    • 如果不设置,计时器会发生什么。
    • @LittleFunny 我已经修改了内容。你能试试这个吗?在此代码中,当应用程序在 10 分钟暂停并恢复应用程序时,事件将在 20 分钟而不是 30 分钟触发。
    • 我认为 Temporary Timer Tick 方法应该调用 DownloadEntityFromServer 然后调用 NSTimer.CreateRepeatingScheduledTimer 。
    猜你喜欢
    • 2018-03-11
    • 2016-01-13
    • 1970-01-01
    • 1970-01-01
    • 2023-03-23
    • 2014-09-14
    • 2013-03-21
    • 1970-01-01
    • 2013-07-27
    相关资源
    最近更新 更多