thread example ejemplo android background runnable

android - example - El hilo no interrumpe



thread android (1)

Está llamando a interrupt() en el hilo de reproducción, pero probablemente esté esperando en sleep en ese momento. Esto dormirá para lanzar una InterruptedException . Debes atrapar esa excepción y salir del ciclo para detener la reproducción:

try { Thread.sleep(NOTE_DURATION); } catch (InterruptedException e) { // XXX need to stop playing here, maybe return or break? return; }

Dado que la interrupt() también puede venir en un momento diferente, debe probar el estado de interrupción y salir de su ciclo:

if (!paused && !Thread.currentThread().isInterrupted()) { ...

Además, todas las variables que se comparten entre dos subprocesos deben synchronized o marcarse como volatile . La bandera paused probablemente debería ser volatile aquí:

volatile boolean paused = false

Por último, para la posteridad, cuando capture InterruptedException , borrará el estado de interrupción del hilo. Por lo general, es una buena práctica establecer inmediatamente el indicador de interrupción en el hilo para que otros puedan probarlo:

try { Thread.sleep(NOTE_DURATION); } catch (InterruptedException e) { // re-establish the interrupt condition Thread.currentThread.interrupt(); ... }

Estoy aprendiendo cómo usar hilos en Android, y para hacer eso hice una pequeña aplicación que reproduce una serie de notas. La idea es que haya un botón de inicio y un botón de finalización y que (obviamente) si presiona el botón de inicio, empiece a reproducir música, y si presiona el botón de finalizar, se detiene. El botón de inicio funciona bien, pero el problema es que el botón de finalización no funciona. Tengo problemas para descubrir por qué, así que tal vez algunos de ustedes puedan ayudarme. Este es el código:

public class PressAndPlay extends Activity { private volatile Thread initBkgdThread; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); Button startButton = (Button) findViewById(R.id.trigger); startButton.setOnClickListener(new View.OnClickListener() { public void onClick(View view) { // create thread initBkgdThread = new Thread(new Runnable() { public void run() { play_music(); } }); initBkgdThread.start(); } }); Button endButton = (Button) findViewById(R.id.end); endButton.setOnClickListener(new View.OnClickListener() { public void onClick(View view) { end_music(); } }); } int[] notes = {R.raw.c5, R.raw.b4, R.raw.a4, R.raw.g4}; int NOTE_DURATION = 400; MediaPlayer m_mediaPlayer; private void play_music() { for(int ii=0; ii<12; ii++) { //check to ensure main activity is not paused if(!paused) { if (m_mediaPlayer != null) {m_mediaPlayer.release();} m_mediaPlayer = MediaPlayer.create(this, notes[ii%4]); m_mediaPlayer.start(); try { Thread.sleep(NOTE_DURATION); } catch (InterruptedException e) { e.printStackTrace(); } } } } private void end_music() { if(initBkgdThread != null) { initBkgdThread.interrupt(); initBkgdThread = null; } } boolean paused = false; @Override protected void onPause() { paused = true; super.onPause(); } @Override protected void onResume() { super.onResume(); paused = false; } }