2010-09-14 10 views
17

Supongamos que tengo un código en el controlador onStart() de mi servicio para iniciar un hilo y hacer algunas cosas y luego llamar a stopSelf().Llamar a stopSelf() en el servicio mientras se ejecuta el hilo

stopSelf() se invoca antes de que termine el hilo. ¿Qué pasa exactamente?

He probado esto yo mismo y mi hilo continúa ejecutándose hasta que se termina. ¿Escucha Android la llamada stopSelf(), pero la pospone hasta que finalice el hilo?

@Override 
public void onStart(Intent intent, int startid) { 
    new Thread(new Runnable() { 
     public void run() { 
     // TODO some long running operation 
     } 
    }).start(); 
    stopSelf(); 
} 
+1

Por favor, publique un código ... – Kiril

+1

incluso ese pequeño código de ayuda ... el orden de ejecución no se aplica claramente debido al multihilo, por lo que la respuesta aceptada indica: está "filtrando" un hilo + referencia al servicio. – Kiril

+0

¿No debería utilizar 'onStartCommand' en lugar de' onStart' para iniciar subprocesos? –

Respuesta

21

stopSelf() es llamado antes de que acabe hilo. ¿Qué pasa exactamente?

El hilo se ha completado.

¿Escucha Android la llamada stopSelf(), pero la pospone hasta que finaliza el subproceso?

No. Su Service sigue destruido en el momento de la llamada stopSelf(). Solo está filtrando un hilo y el objeto Service, al menos hasta que termine el hilo.

Es posible que desee considerar el cambio a IntentService, ya que integra el patrón background-thread-and-stopSelf().

+2

Entonces, si entiendo esto correctamente, un servicio de intención ejecutará el código en onHandleIntent en un hilo; así que no necesito hacer ningún enhebrado con mi código. Además, IntentService se matará cuando el código termine de ejecutarse. Si se transfiere otra intención a IntentService, manejará esa intención cuando la ejecución finalice. Cuando todo está terminado, se mata a sí mismo. Fuera de IntentService, todo lo que necesito hacer es llamar a startService con mi Intent. ¿Sí? – Andrew

+0

¿Hay alguna manera de forzar una intención al principio de la cola? Hacer la cola de estas acciones está bien la mayor parte del tiempo, pero digamos que quiero que IntentService acceda a un servicio web para extraer datos. Me gustaría que salte todo en la cola y suceda de inmediato. El subproceso de interfaz de usuario no se puede congelar, pero el usuario aún está esperando esos datos. – Andrew

+2

@Andrew: "¿Sí?" - si. "¿Hay alguna manera de forzar un intento al frente de la cola?" - No es que yo sepa, aunque puede reemplazar la cola con un 'PriorityQueue' de alguna manera. IIRC, 'IntentService' no es una clase muy grande, por lo que quizás pueda clonarlo para ajustar la implementación de cola para satisfacer sus necesidades. – CommonsWare

1

Si llama a stopself() desde dentro del hilo. Puede llamar a stopSelf() en cualquier punto de su cadena cada vez que desee detener el servicio. Pero incluso entonces, el hilo continuará ejecutándose. Si desea que el servicio se detenga tan pronto como se complete la secuencia, llame a stopSelf() en la última línea de su cadena de caracteres.

+0

desde mi experiencia, un servicio no se detiene al llamar a stopSelf() dentro de un subproceso (Android 4.2.2). Es mejor usar una Asynctask y llamar a stopSelf en onCanceled o onPostExecute. –

Cuestiones relacionadas