While developing your application in Xamarin that requires a Timer, you have the option to use the Device Timer. However, one of the first caveat your would notice is that while Device Class has a Device.StartTimer method, it does not exposes a Stop method, leaving it to your own class to handle it.
I started by writing an interface for my proposed Timer Class ( in my case a Countdown timer), so that I could use it for mocking for the sake of my Unit Tests. This is how my interface looked like.
public class TimerEventArgs:EventArgs { public TimeSpan TimeRemaining { get; set; } } public interface ICountdownTimer { void Start(TimeSpan CountdownTime); void Stop(); event EventHandler<TimerEventArgs> Ticked; event EventHandler Completed; event EventHandler Aborted; }
Following is how the implementation looked like.
public class CountdownTimer : ICountdownTimer { #region Private Variable private bool _Stopped = false; private TimeSpan _Second = new TimeSpan(0, 0, 1); private readonly TimeSpan _Interval; private TimeSpan _TimeRemaining; private EventHandler _TickedEvent; private EventHandler _CompletedEvent; private EventHandler _AbortedEvent; #endregion #region Ctor public CountdownTimer() { _Interval = _Second; } #endregion #region ICountdownTimer event EventHandler ICountdownTimer.Ticked { add { _TickedEvent += value; } remove { _TickedEvent -= value;} } event EventHandler ICountdownTimer.Completed { add { _CompletedEvent += value; } remove { _CompletedEvent -= value;} } event EventHandler ICountdownTimer.Aborted { add { _AbortedEvent += value; } remove { _AbortedEvent -= value;} } public void Start(TimeSpan CountdownTime) { _TimeRemaining = CountdownTime; _Stopped = false; Device.StartTimer(_Interval, () => { if (this._Stopped) { _AbortedEvent?.Invoke(this, EventArgs.Empty); return false; } _TimeRemaining-= _Second; _TickedEvent?.Invoke(this,new TimerEventArgs { TimeRemaining = _TimeRemaining }); _Stopped = _TimeRemaining.Duration() == TimeSpan.Zero; if (_Stopped) _CompletedEvent?.Invoke(this, EventArgs.Empty); return !_Stopped; }); } public void Stop() { _Stopped = true; } #endregion
how to implement this. i need the step to implement
LikeLike