Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

625
Views
Cómo usar Thread.sleep() en Kotlin

Esto viene de cerca del final del laboratorio de código que se encuentra aquí:

Introducción a la depuración: ejemplo de depuración: acceder a un valor que no existe

Todo esto está dentro del archivo MainActivity.kt

Aquí está mi onCreate

 class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) val helloTextView: TextView = findViewById(R.id.division_textview) helloTextView.text = "Hello, debugging!" division() } //...

Aquí está la función de división proporcionada por Google, pero con 2 cambios que explicaré en un momento...

 fun division() { val numerator = 60 var denominator = 4 repeat(4) { Thread.sleep(3000) findViewById<TextView>(R.id.division_textview).setText("${numerator / denominator}") Log.v(TAG, "${numerator / denominator}") denominator-- } }

Las instrucciones hacen que parezca que esperan que sleep() acepte segundos, pero AS indica que espera milisegundos, así que cambié sus 3 a 3000. Log.v(TAG, "${numerator / denominator}") para ver qué estaba sucediendo porque no estaba funcionando como se esperaba.

El objetivo de esto era que el emulador creara un gif de los cocientes que se estaban actualizando. Se supone que esto es útil al depurar.

No aparece nada en la pantalla, ni siquiera el nombre de la aplicación, hasta que finaliza la repeat() . Los registros ocurren en intervalos de 3 segundos, como se esperaba.

¿Por qué está esperando el diseño y cómo hago para que se actualice en cada iteración del bucle?

over 4 years ago · Santiago Trujillo
4 answers
Answer question

0

Intenta usar rutinas. Aquí hay un enlace: https://kotlinlang.org/docs/coroutines-basics.html

over 4 years ago · Santiago Trujillo Report

0

Honestamente, no tengo idea de lo que está haciendo Codelab, según el código que proporcionan. La aplicación no generará nada (ni el diseño, ni ningún cambio en el diseño) antes de que termine onCreate , y onCreate no terminará hasta que haya ejecutado todo su código, incluido ese bloque de repeat en la función de division que llama.

La division no está iniciando ningún subproceso de trabajo, por lo que todo lo que Thread.sleep está haciendo es bloquear el subproceso principal: está bloqueando la aplicación. Y tienes razón, el sleep toma un valor de milisegundos, no segundos. Tengo la sensación de que en realidad no ejecutaron este código, está lleno de otros errores e inconsistencias que, honestamente, dificultaron saber lo que estabas destinado a ser. haciendo. ¿Cambiar qué llamada Log.d ? ¿Los de onCreate? (En realidad se refieren a la llamada Log.v en division , supongo )


Así es como usaría un subproceso en Kotlin: debe crear uno nuevo (para que esté fuera del subproceso principal, de modo que pueda terminar de crear la actividad y ejecutar la interfaz de usuario):

 fun division() { // create a new thread (and start it immediately) thread(start=true) { repeat(4) { i -> Thread.sleep(3000L) // assuming you've done the ``findViewById`` and assigned it to a variable runOnUiThread { divisionTextView.text = "$i" } } } }

Eso es solo actualizar con el número de repetición actual ( i ) por brevedad, pero las cosas importantes son:

  • estás creando un nuevo hilo para hacer el trabajo (y dormir)
  • está utilizando runOnUiThread (que es un método en la Actividad) para actualizar el texto en el subproceso principal/UI (lo mismo). Si intenta tocar la interfaz de usuario desde otro hilo , se bloqueará

Otra forma de hacerlo es post un ejecutable en el subproceso de la interfaz de usuario a través de una vista, también puede usar ese TextView :

 divisionTextView.post { divisionTextView.text = "$i" }

Las rutinas serían una mejor idea aquí (puede ejecutarlas en el subproceso principal sin que se bloqueen, por lo que no tiene que preocuparse por cambiar los subprocesos para actualizar la interfaz de usuario o cualquier cosa de seguridad del subproceso), pero eso es lo básico para hacer un subproceso. . Realmente no tengo idea de lo que está pasando en ese laboratorio de código.

over 4 years ago · Santiago Trujillo Report

0

Puedes usar Coruntines. la función de retardo es muy fácil de usar

 lifecycleScope.launch { myTextView.text = "Starting" delay(1000L) myTextView.text = "Processing" delay(2000L) myTextView.text = "Done" }
over 4 years ago · Santiago Trujillo Report

0

No aparece nada en la pantalla, ni siquiera el nombre de la aplicación, hasta que finaliza la repetición (). Los registros ocurren en intervalos de 3 segundos, como se esperaba. ¿Por qué está esperando el diseño?

Se debe al ciclo de vida de la actividad .

  • Cuando la actividad está en el estado Creado, no puede ver la interfaz de usuario.
  • Cuando la actividad está en estado Iniciado, la interfaz de usuario se vuelve visible pero no puede interactuar con ella.
  • Cuando la actividad está en estado Reanudado, la interfaz de usuario está visible y puede interactuar con ella.

Dado que está llamando a la función division() en la devolución de llamada onCreate(), no verá la IU de actividad.

¿Cómo hago que se actualice en cada iteración del bucle?

Una forma de hacerlo es ejecutar la función division() en un hilo nuevo. Al hacerlo, la banda de rodadura principal muestra la interfaz de usuario (no podrá verla). Luego use runOnUiThread para actualizar el texto de su division_textview.

 fun division() { val numerator = 60 var denominator = 4 thread(start=true) { /* The loop only repeat 4 times to avoid a crash*/ repeat(4) { Log.v(TAG, "$denominator") // Set division_textview text to the quotient. runOnUiThread { findViewById<TextView>(R.id.division_textview).setText("${numerator / denominator}") } // Wait for 1 second Thread.sleep(1000L) denominator-- } } }
over 4 years ago · Santiago Trujillo Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!