¿Por qué no se detiene el hilo?

Mi servicio genera un nuevo subproceso y lo detiene de acuerdo con el método java normalmente recomendado de interrupción (). Cuando paro el servicio, paro el hilo en onDestroy (). Se detiene el servicio y se alcanza el código de interrupción. Sin embargo, muy pronto el subproceso se reinicia desde el principio del Runnable.

public class DoScan extends Service { public volatile Thread runner; @Override public IBinder onBind(Intent intent) { return null; } @Override public void onCreate() { super.onCreate(); startThread(); } @Override public void onDestroy() { super.onDestroy(); android.util.Log.v("@@@@@@@@@@@@@@@@@@@@", "DoScan.onDestroy"); stopThread(); } public synchronized void startThread(){ if(runner == null){ android.util.Log.v("@@@@@@@@@@@@@@@@@@@@", "DoScan.startthread"); runner = new Thread(new ScanningThread()); runner.start(); } } /* use a handler in a loop cycling through most of oncreate. * the scanningthread does the work, then notifies the svc's uithread */ public synchronized void stopThread(){ if(runner != null){ android.util.Log.v("@@@@@@@@@@@@@@@@@@@@", "DoScan.stopthread"); Thread moribund = runner; runner = null; moribund.interrupt(); android.util.Log.v("@@@@@@@@@@@@@@@@@@@@", "interrupted?" + moribund.isInterrupted()); } } } 

Creo que la forma más segura es tener una bandera para que el hilo lo compruebe dentro de su bucle principal.

 class ScanningThread extends Thread { // Must be volatile: private volatile boolean stop = false; public void run() { while (!stop) { System.out.println("alive"); } if (stop) System.out.println("Detected stop"); } public synchronized void requestStop() { stop = true; } } public synchronized void startThread(){ if(runner == null){ android.util.Log.v("@@@@@@@@@@@@@@@@@@@@", "DoScan.startthread"); runner = new ScanningThread(); runner.start(); } } public synchronized void stopThread(){ if(runner != null){ android.util.Log.v("@@@@@@@@@@@@@@@@@@@@", "DoScan.stopthread"); runner.requestStop(); runner = null; } } 

El problema es que el hilo necesita cooperar comprobando periódicamente la interrupción y la salida si el hilo se ha interrumpido. A menos que coloque algo en la línea de lo siguiente en su hilo …

  // Procesando ...
  if (Thread.interrupted ()) {
     regreso;
  }
  // Más procesamiento ...
  tratar{
     Thread.sleep (tiempo de sueño);
  } catch (InterruptedException interrupt) {
     regreso;
  }
  // Enjuague y repita...

… su hilo ignorará el hecho de que ha sido interrumpido. El método propuesto por Lucas S. es esencialmente idéntico, excepto que el uso de la interrupción generará una excepción si el hilo está bloqueado, mientras que bajo el método de Lucas S., es posible que tenga que esperar indefinidamente para que el hilo salga.

Interrumpir un hilo lanza una excepción en el hilo, no lo detiene necesariamente. Usted debe coger esa excepción y luego hacer la limpieza en el hilo antes de salir (siempre, es necesario salir!).

  • Java.lang.RuntimeException: Sólo se puede crear un Looper por subproceso
  • Esperando que el hilo termine sin bloquear el hilo de la interfaz de usuario
  • Clase "Handler" similar en Java
  • Espere a que el hilo en línea termine antes de pasar al siguiente método
  • Notificando un solo hilo: notify, notifyAll o concurrent.locks.Condition?
  • ¿Cómo puedo mantener vivo un hilo de conexión? (¿Necesito usar un daemon?)
  • ¿Los hilos se eliminan automáticamente después de que el método run () sale en Java?
  • Cómo "esperar" un hilo en Android
  • Número de impacto del Servicio en la eficiencia de la aplicación
  • Puedo matar o terminar () una actividad en un hilo que no sea el hilo de la interfaz de usuario ...?
  • Android: ¿Posible que el hilo de fondo bloquee hasta que el hilo de UI finalice la operación?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.