Saltar al contenido

Los temporizadores (setInterval) en aplicaciones iónicas se duermen después de un tiempo en segundo plano

Esta crónica ha sido aprobado por especialistas para garantizar la veracidad de este enunciado.

Solución:

Después de horas de buscar una respuesta, finalmente encontré mi propio truco. Espero que esta solución pueda ayudar a otros que se encuentren con un problema similar.

Cuando la aplicación pasa a un segundo plano, en algún momento aleatorio, el temporizador deja de funcionar y se duerme hasta que la aplicación vuelve al primer plano. Cuando la aplicación aparece en primer plano, el temporizador comienza a funcionar nuevamente desde el punto en que se durmió.

  • Solución/truco:

    1. Registre la marca de tiempo en una variable separada (en segundos) y actualícela en cada intervalo del temporizador.

      var timeStamp = Matemáticas.piso(Fecha.ahora() / 1000);

    2. Verifique cada intervalo del temporizador si la diferencia entre la marca de tiempo de su intervalo anterior y la marca de tiempo más reciente (nueva) es mayor a un segundo. Si se cumple la condición, agregue la diferencia entre esas dos marcas de tiempo a su tiempo de tictac.

  • Cómo funciona:

    Aplicación en primer plano

    1. Justo antes de que el temporizador comience a funcionar
      – Marca de tiempo registrada (Suponga 1 segundo)
    2. Los temporizadores comienzan a funcionar
      – comprobar estado

      if(currentTimeStamp - previousTimeStamp > 1)

      Add the the above difference to the time

      Before the interval ends, update the TimeStamp variable with the currentTimeStamp.

      En el primer intervalo, currentTimeStamp debe ser de 1 segundo o 2 segundos dependiendo del clima en el que esté descargando el temporizador en un setTimeout. Por lo tanto, la diferencia definitivamente será 0 o 1. Dado que la condición no coincide, actualizamos la marca de tiempo con 1 o 2 segundos y pasamos al siguiente intervalo. Mientras el temporizador no se vaya a dormir, nuestra condición fallará.

    Aplicación en segundo plano

    Extrañamente, después de 10 minutos, el temporizador se va a dormir (nuestro temporizador está literalmente perdiendo la noción del tiempo a partir de ahora porque el siguiente intervalo no se activa).

    Regreso de la aplicación de fondo a primer plano

    El temporizador comienza a funcionar desde donde se detuvo (es decir, el siguiente intervalo). Ahora, la diferencia en nuestra condición debería ser más de un segundo y, por lo tanto, agregar esa diferencia (básicamente el tiempo perdido) a nuestro tiempo actual.

  • Código:

    var transactionTime = 0; //Initial time of timer
    var timeStamp = Math.floor(Date.now() / 1000);
    var deltaDelay = 1;
    
    setInterval(function () 
        if (transactionTime != 0 && (Math.floor(Date.now() / 1000) - timeStamp) > deltaDelay) 
                transactionTime += (Math.floor(Date.now() / 1000) - timeStamp);
            
            timeStamp = Math.floor(Date.now() / 1000);
    
            //Update your element with the new time.
            window.document.getElementById("transaction_timer").innerHTML = util.formatIntoHHMMSS(transactionTime++);
    
        , 1000);
    

    Nota: Esta solución funciona de forma independiente (vanilla Js con DOM api nativo) y también funciona muy bien en directivas angulares.

    Puede aumentar el deltaTime del código anterior a 2 para que sea un poco más preciso si, por casualidad, su único hilo está ocupado en otro lugar con alguna otra tarea.
    PD: De hecho, estoy ejecutando la aplicación iónica dentro de mi propia instancia de una vista web y no de Cordova, por lo que no puedo usar ningún complemento elegante de Cordova.

  • Finalizando este artículo puedes encontrar las críticas de otros programadores, tú también eres capaz insertar el tuyo si dominas el tema.

    ¡Haz clic para puntuar esta entrada!
    (Votos: 0 Promedio: 0)



    Utiliza Nuestro Buscador

    Deja una respuesta

    Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *