es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

CountDownTimer con ProgressBar, continuando la barra de progreso al reiniciar la aplicación.

Tengo una ProgressBar que muestra la progresión de un CountdownTimer. La ProgressBar funciona excepto cuando cierro la aplicación y la vuelvo a iniciar. Si hago eso, la ProgressBar comienza desde cero. No continúa donde lo dejé.

Tengo una variable para mantener la cuenta regresiva en milisegundos. Logro mantenerla correctamente utilizando SharedPreferences en los métodos OnStop y OnStart. Pero, ¿cómo uso esta variable correctamente para mantener el progreso de la ProgressBar?

private fun startCountdown() {

var i = 1

object : CountDownTimer(timeLeftInMilliseconds, 1000) {

    override fun onTick(millisUntilFinished: Long) {

        timeLeftInMilliseconds = millisUntilFinished

        i++

        myProgressBar.progress = (i * 100 / (40000 / 1000)).toInt()
        //En lugar de 40000 aquí, he intentado usar la variable 
        //timeLeftInMilliSeconds o millisUntilFinished, pero eso no funciona. 
    }

    override fun onFinish() {
        progressBarOutOfLikesTimer.progress = 100;
        timeLeftInMilliseconds = 40000
    }

}

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Para mantener el progreso de la ProgressBar incluso después de cerrar y volver a abrir la aplicación, debes guardar el progreso actual de la ProgressBar junto con el tiempo restante en milisegundos. Puedes lograr esto utilizando SharedPreferences en el método onStop y recuperándolo en el método onStart.

    Aquí tienes un ejemplo de código:

    private lateinit var sharedPreferences: SharedPreferences
    
    private fun startCountdown() {
    
        var i = 1
    
        object : CountDownTimer(timeLeftInMilliseconds, 1000) {
    
            override fun onTick(millisUntilFinished: Long) {
    
                timeLeftInMilliseconds = millisUntilFinished
    
                i++
    
                myProgressBar.progress = (i * 100 / (40000 / 1000)).toInt()
                //En lugar de 40000 aquí, usa timeLeftInMilliseconds o millisUntilFinished.
    
                //Guardar progreso y tiempo restante en SharedPreferences
                sharedPreferences.edit().apply {
                    putInt("progreso", myProgressBar.progress)
                    putLong("tiempoRestanteEnMilisegundos", timeLeftInMilliseconds)
                    apply()
                }
            }
    
            override fun onFinish() {
                myProgressBar.progress = 100
                timeLeftInMilliseconds = 40000
    
                //Borrar SharedPreferences cuando se finaliza la cuenta regresiva
                sharedPreferences.edit().clear().apply()
            }
    
        }.start()
    }
    
    override fun onStop() {
        super.onStop()
    
        //Guardar progreso y tiempo restante en SharedPreferences cuando se cierra la aplicación
        sharedPreferences.edit().apply {
            putInt("progreso", myProgressBar.progress)
            putLong("tiempoRestanteEnMilisegundos", timeLeftInMilliseconds)
            apply()
        }
    }
    
    override fun onStart() {
        super.onStart()
    
        //Recuperar progreso y tiempo restante desde SharedPreferences cuando se abre la aplicación nuevamente
        val progreso = sharedPreferences.getInt("progreso", 0)
        val tiempoRestante = sharedPreferences.getLong("tiempoRestanteEnMilisegundos", 40000)
    
        //Actualizar la ProgressBar y timeLeftInMilliseconds con los valores recuperados
        myProgressBar.progress = progreso
        timeLeftInMilliseconds = tiempoRestante
    
        //Iniciar la cuenta regresiva nuevamente
        startCountdown()
    }
    

    En este código, estamos utilizando SharedPreferences para guardar y recuperar el progreso de la ProgressBar y el tiempo restante en milisegundos cuando se cierra y se vuelve a abrir la aplicación. En el método onStart, primero recuperamos el progreso y el tiempo restante guardados y luego actualizamos la ProgressBar y timeLeftInMilliseconds con esos valores antes de iniciar la cuenta regresiva nuevamente. De esta manera, la ProgressBar debería continuar desde donde se detuvo incluso después de cerrar y volver a abrir la aplicación.

Comments are closed.