2012-06-19 19 views
5

Creé un servicio (servicio B) a partir de la Actividad (Actividad A). Y desde el servicio B, creé otro servicio (servicio C). anteriormente, el servicio C solía ser un hilo, no un servicio. Dado que tiene problemas a largo plazo, lo cambié a un servicio. El servicio C ejecuta un ciclo while con 3 segundos de llamadas Thread.sleep. Pero el estado general no se detiene. El registro muestra que el servicio se está ejecutando. Pero la IU está bloqueada y después de unos pocos minutos, el sistema me pregunta si debo cerrar.¿por qué mi servicio bloquea la interfaz de usuario?

¿Cómo hacer que este servicio no bloquee la llamada?

+1

tienen que creó el hilo en el servicio C como servicio también se ejecuta en el hilo principal. –

+0

solo llamo startService desde el servicio B para iniciar el servicio C. – dinesh707

+0

, ¿el servicio B está haciendo su trabajo en otro hilo? –

Respuesta

3

A partir de la documentación de servicio en Android

Un servicio no es un proceso separado. El objeto de servicio en sí no implica que se esté ejecutando en su propio proceso; a menos que se especifique lo contrario, se ejecuta en el mismo proceso que la aplicación de la que forma parte.

A El servicio no es un hilo. No es un medio para hacer el trabajo fuera del hilo principal (para evitar errores de la aplicación no responde).

La mejor manera en este caso es iniciar un nuevo hilo y luego llamar a un servicio desde allí.

+0

pero cuando lo ejecuto en un hilo durante un período de tiempo más largo, el hilo bloquea la aplicación completa. :( – dinesh707

+0

¿Puedes pegar el código y los registros de errores? Eso será útil –

2

creo que el servicio se está ejecutando en C hilo principal, intente crear otro hilo (hilo nuevo o AsyncTask)

0

Servicios siempre se ejecutan en el hilo principal. Necesita generar un hilo de fondo o ejecute repetidamente un TimerTask etc. en su Servicio C para evitar el bloqueo del hilo de la interfaz de usuario.

2

Sí, a partir de la documentación, está claro que los servicios no son procesos separados. Más bien, siga abajo para hacer que funcione:

  1. iniciar un servicio desde donde se desea iniciar
  2. En la clase de servicio que escribió, escribir otro hilo que se extiende clase privada que se asegurará de toda su materia fondo se ejecutar en un hilo de fondo que está separado de un proceso de correo
  3. Inicia un hilo desde onCreate method of service's class. Si inicia su trabajo de fondo en onStartCommand, puede iniciar accidentalmente múltiples servicios haciendo la misma tarea. Ej. Le has dado un botón a tu actividad que iniciará el servicio en segundo plano. Y si hace clic varias veces, comenzará esa cantidad de servicios en segundo plano.

    Por lo tanto, si omite onCreate method from service, comprobará si el servicio ya se está ejecutando o no, y si no se está ejecutando, iniciará el servicio. De lo contrario, saltará y no comenzará otro servicio.

Cuestiones relacionadas