¿Cómo puedo cancelar desde Device.StartTimer?
Cuando uso System.Threading.Timer puedo detener mi temporizador e iniciarlo de nuevo:
protected override void OnScrollChanged(int l, int t, int oldl, int oldt) { if (timer == null) { System.Threading.TimerCallback tcb = OnScrollFinished; timer = new System.Threading.Timer(tcb, null, 700, System.Threading.Timeout.Infinite); } else { timer.Change(System.Threading.Timeout.Infinite, System.Threading.Timeout.Infinite); timer.Change(700, System.Threading.Timeout.Infinite); } }
¿Cuál es la mejor manera de detener Device.StartTimer e iniciarlo de nuevo?
- AndroidGameView + GC_MINOR
- Visual Studio 2017 - Xamarin - El archivo "obj \ Debug \ android \ bin \ packaged_resources" no existe
- No se puede ejecutar el emulador de Android
- Xamarin Android Exception causa "Frame no en el módulo"
- Xamarin Android EditarTexto ingresar clave
- InstantiationException: No se puede instanciar fragmento Asegúrese de que el nombre de clase existe, es público y tiene un constructor vacío que es público
- ¿Cómo puedo cambiar colores en mi StateListDrawable?
- ¿Dónde está la clave de firma de Android en el disco que crea Xamarin Studio?
- Akavache no mantiene datos de caché entre reinicios de la aplicación
- OnConfigurationChanged no se llama en mono android
- El botón Atrás de la barra de herramientas no funciona
- Esperando separador de ruta de clase ';' Antes de '\ Android \ android-sdk \ build-tools \ 23.0.1 \ lib \ shrinkedAndroid.jar' en el argumento número 8
- Fundamentos de Xamarin. Construcción fallida. Consulte el registro de compilación para obtener detalles
Supongo que se está refiriendo a Device.StartTime en XamarinForms. La forma de detener o continuar una tarea recurrente se determina por lo que devuelve el segundo argumento:
// run task in 2 minutes Device.StartTimer(TimeSpan.FromMinutes(2), () => { if (needsToRecur) { // returning true will fire task again in 2 minutes. return true; } // No longer need to recur. Stops firing task return false; });
Si desea detener temporalmente este temporizador y volver a dispararlo después de algún tiempo, deberá volver a llamar a Device.StartTimer
. Sería agradable para envolver esto en su propia clase donde se puede utilizar a un miembro privado para determinar si una tarea continua todavía se está ejecutando. Algo como esto:
public class DeviceTimer { readonly Action _Task; readonly List<TaskWrapper> _Tasks = new List<TaskWrapper>(); readonly TimeSpan _Interval; public bool IsRecurring { get; } public bool IsRunning => _Tasks.Any(t => t.IsRunning); public DeviceTimer(Action task, TimeSpan interval, bool isRecurring = false, bool start = false) { _Task = task; _interval = interval; IsRecurring = isRecurring; if (start) Start(); } public void Restart() { Stop(); Start(); } public void Start() { if (IsRunning) // Already Running return; var wrapper = new TaskWrapper(_Task, IsRecurring, true); _Tasks.Add(wrapper); Device.StartTimer(_interval, wrapper.RunTask); } public void Stop() { foreach (var task in _Tasks) task.IsRunning = false; _Tasks.Clear(); } class TaskWrapper { public bool IsRunning { get; set; } bool _IsRecurring; Action _Task; public TaskWrapper(Action task, bool isRecurring, bool isRunning) { _Task = task; _IsRecurring = isRecurring; IsRunning = isRunning; } public bool RunTask() { if (IsRunning) { _Task(); if (_IsRecurring) return true; } // No longer need to recur. Stop return IsRunning = false; } } }
- ¿Cuál es la forma más sencilla de detectar si un dispositivo Android Wear está conectado al teléfono?
- Problemas para leer el sensor de frecuencia cardíaca de Moto 360 – Android Wear