Android gestión de hilos onPause

Tengo una clase que extiende la clase Thread y tiene su método run implementado como tal.

public void run(){ while(!terminate){ if(paused){ Thread.yield(); }else{ accummulator++; } } } 

Este hilo se genera a partir del método onCreate.

Cuando mi interfaz de usuario está oculta (cuando se presiona la tecla Inicio) mi método onPause establecerá la bandera pausada en true y producirá la pisada. Sin embargo, en el DDMS todavía veo el uTime del hilo se acumulan y su estado como "running".

Así que mi pregunta es. ¿Cuál es la manera correcta de detener el hilo para que no utilice el tiempo de CPU?

3 Solutions collect form web for “Android gestión de hilos onPause”

En realidad es una mala práctica mantener un hilo que se ejecuta después de onPause. La razón es que después de onPause su aplicación puede caer de la memoria en cualquier momento sin ser capaz de saber, por lo tanto no será capaz de limpiar después de sí mismo.

La forma correcta de hacerlo es detener el subproceso onPause y recrearlo enResume. Si necesita un estado, puede usar los métodos o configuraciones de saveState de Android incorporados o lo que sea necesario para mantenerlo.

A pesar de que estás llamando a thread.yield (), estás dentro de un while () loop que es probablemente looping miles de veces por segundo, cada vez que llama .yield (), pero el hecho de que está fuera de control de bucle significa que Está utilizando recursos. Si pones un mensaje Log.d ahí, verás lo que quiero decir.

Recomiendo usar un Thread.sleep() lugar de Thread.yield() . La razón es, mientras que un hilo está durmiendo, se cede. Además, con el sueño se obtiene el beneficio añadido de disminuir el while() y no utilizar los recursos. Un intervalo de sueño de 500ms debe ser suficiente =)

Es probable que la variable paused esté en caché thread-local. Esto es porque sólo se lee y no se cambia en el bucle. Así que lo que está ocurriendo es que el compilador / intérprete / jitter se optimiza leyendo sólo la variable una vez y luego ejecutando solamente la rama else . Necesita marcar ese campo como volatile para que la variable de pause se lea cada iteración a través del bucle. Consulte la documentación de la palabra clave volatile . He aquí algunos datos sobre el enhebrado y algo de información sobre sincronización y concurrencia .

  • Conjunto de subprocesos en Java
  • Nuevo hilo varias veces
  • Obtener referencia a Thread Object desde su ID
  • ¿Cómo detener un hilo?
  • Llamada Hilo principal de hilo secundario en Java / Android
  • Android, cuando debo usar syncronized en un hilo
  • Hilo android sigue funcionando después de presionar el botón Atrás
  • Notificando un solo hilo: notify, notifyAll o concurrent.locks.Condition?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.