Таймер в Xamarin Forms
Таймер будет выполнять кусок кода в некотором временном интервале. В Xamarin, каждая из платформ предоставляет свой собственный таймер, а таймер в Xamarin Forms использует их. Это не System.Threading.Timer
из обычного профиля на основе PCL, однако если вы используете .NET Standard вы будете иметь доступ к System.Threading.Timer
.
Далее мы рассмотрим таймер в Xamarin Forms.
Таймер в Xamarin Forms
Для начала, вот основной таймер, который используется в Xamarin Forms:
Device.StartTimer(TimeSpan.FromSeconds(30), () =>
{
// что-то делаем здесь...
return true; // True = повторить снова, False = остановить таймер
});
На уровне платформы, используются следующие реализации:
iOS
public void StartTimer(TimeSpan interval, Func<bool> callback)
{
NSTimer timer = NSTimer.CreateRepeatingTimer(interval, t =>
{
if (!callback())
t.Invalidate();
});
NSRunLoop.Main.AddTimer(timer, NSRunLoopMode.Common);
}
Android
public void StartTimer(TimeSpan interval, Func<bool> callback)
{
var handler = new Handler(Looper.MainLooper);
handler.PostDelayed(() =>
{
if (callback())
StartTimer(interval, callback);
handler.Dispose();
handler = null;
}, (long)interval.TotalMilliseconds);
}
UWP
public void StartTimer(TimeSpan interval, Func<bool> callback)
{
var timer = new DispatcherTimer { Interval = interval };
timer.Start();
timer.Tick += (sender, args) =>
{
bool result = callback();
if (!result)
timer.Stop();
};
}
Таймер
В то время как таймер прост в использовании, есть ряд моментов, которые необходимо учитывать при его использовании.
Жизненный цикл
Жизненный цикл таймера - это то, о чем нужно помнить. Таймер представляет собой глобальную систему синхронизации, то есть любая ссылка, которую вы помещаете в код, будет ссылаться до тех пор, пока таймер не остановится. Следовательно, вы должны поставить условие внутри таймера, чтобы остановить его, когда он больше не требуется. Невыполнение этого может привести к утечке памяти.
Многопоточность
Любой код, запущенный в таймере, будет запущен в основном потоке пользовательского интерфейса. Убедитесь, что вы не блокируете поток пользовательского интерфейса и не выполняете интенсивных вычислений. Убедитесь, что код перемещается в фоновый поток, если это необходимо.
Состояние приложения
Если ваше приложение настроено в фоновом режиме, таймер будет продолжать работать, пока он не будет по крайней мере прерван или убит.
Теги: xamarin forms, c#, сниппет, перевод