2011-03-03 9 views
7

Tengo un servicio que genera un hilo de descarga que descarga a veces archivos de gran tamaño. Me di cuenta de que tan pronto como el teléfono se fuera a dormir, el hilo de descarga se ralentizaría significativamente, luego se detendría.PARTIAL_WAKE_LOCK contra SCREEN_DIM_WAKE_LOCK en el hilo de descarga

El remedio obvio, un wakelock. Entonces, creo que estaría bien adquirir partial_wake_lock, solo para mantener la CPU procesando la descarga. Sin embargo, eso no funciona, el mismo comportamiento, la descarga se ralentiza y luego se detiene cuando la pantalla se apaga.

Luego probé un screen_dim_wake_lock. Esta vez, la pantalla permaneció encendida (atenuada) y la descarga siguió funcionando a velocidad máxima hasta que se completó, se lanzó Wakelock y luego el teléfono se quedó dormido.

Mi pregunta es, ¿por qué no puedo mantener mi hilo ejecutándose cuando sostengo un partial_wake_lock igual que durante un screen_dim_wake_lock? ¿Hay algún comportamiento indocumentado sobre la diferencia entre estos 2? ¿Es porque no estoy ejecutando en el hilo de UI quizás?

EDIT:

he añadido un wifilock. El wifi no se va a dormir, pero mi hilo aún muere. Si algún otro proceso despierta el sistema, la descarga continuará a la velocidad normal, luego disminuirá la velocidad nuevamente. Si levanto el teléfono, continuará a una velocidad normal que disminuirá una vez más cuando la pantalla se apague. Parece como si el hilo fuera empujado a un segundo plano por el sistema. Me pregunto si puedo evitar eso.

+0

llegar a ninguna parte con esto? Estoy teniendo un problema similar con la red siendo temperamental a menos que use SCREEN_DIM_WAKE_LOCK. Parcial wake-lock simplemente no es suficiente, ni cuando se combina con WifiLock ... – barkside

Respuesta

1

Tuve el mismo problema con un servicio que continuamente descargaba un conjunto grande de URL. La mejor manera era usar un screen_dim_wake_lock como lo hizo y llevar su servicio al primer plano, como se describe here al .

De esta manera, la pantalla siempre está encendida, por lo que sucede lo mismo y con su interfaz WI-FI. Por el contrario, si deja el teléfono inactivo por un tiempo, la pantalla se apagará, el teléfono entrará en modo de suspensión y el WIFI también se apagará después de 15 minutos.

Por lo tanto, otra forma es utilizar un partial_wake_lock (sólo CPU está encendido) y cambia la configuración de su teléfono de manera que el WIFI para estar siempre en (tal vez esto parece la WIFI_LOCK que adquiera la ..):

  • desde la pantalla principal del sistema o ir a Configuración y luego seleccione
  • inalámbricos & Redes
  • seleccione Configuración Wi-Fi
  • pulse Menú y seleccione avanzada
  • pulse W i-Fi Política de sueño y el cambio a Nunca

A continuación, el servicio funcionará incluso en modo de reposo con la pantalla apagada. El único problema aquí es:

si pierde la conectividad WIFI por un tiempo, entonces el Android puede matar su servicio porque estará inactivo ... Pero si su teléfono siempre está conectado a la red WIFI con buena estabilidad, entonces todo funcionará ¡multa!

+0

+1 me ayudó su respuesta, gracias – Ahmed