¿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()); } } }
- Cómo ejecutar un hilo después de completar otro hilo
- Los anuncios de Android ralentizan mucho el rendimiento
- Acceso a vistas desde otro hilo (Android)
- Cómo comprobar si se ejecuta en el hilo de la interfaz de usuario en Android?
- Android, creando un hilo sencillo que actualizará mi contador de segundos
- Respuesta de respuesta de Okhttp en el hilo principal
- Dormir un hilo hasta que un evento sea asistido en otro hilo
- Android wait asynctask para terminar
- Mi clase AsyncTask tiene otros subprocesos en él. ¿Cómo puedo esperar a que termine con todos sus subprocesos antes de ejecutar un método siguiente?
- Java.lang.IllegalMonitorStateException: objeto no bloqueado por hilo antes de wait ()?
- Cómo ejecutar subprocesos en paralelo en Android
- ¿Cuál es la causa de los picos de rendimiento periódicos que se ven al hacer el procesamiento de matriz de computación caro en el Nexus 4?
- Comunicación multihilo: ¿qué tan bueno es el uso de variables atómicas como AtomicInteger? ¿Por qué no hay AtomicFloat?
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!).