2015-02-10 3 views
0

У меня есть кнопка прослушивания, включающая нить сна и еще один прослушиватель кнопок.Как прервать поток при прослушивании кнопок

Вторая кнопка слушатель должен прервать эту нить, и я не знаю, как это сделать:

Мой код:

button1.setOnClickListener (new View.OnClickListener() { 

     @Override 
     public void onClick(View v) { 


.......... 


       button1.setEnabled(false); 
       button1.setVisibility(View.GONE); 
       button2.setVisibility(View.VISIBLE); 
       button2.setEnabled(true); 


       new Thread(new Runnable() { 

        @Override 
        public void run() { 
         try { 
          Thread.sleep(2800); 
         } catch (InterruptedException e) { 
          // ??????? 
         } 

         MainActivity.this.runOnUiThread(new Runnable() { 

          @Override 
          public void run() { 
           button1.setEnabled(true); 
           button1.setVisibility(View.VISIBLE); 
           button2.setEnabled(false); 
           button2.setVisibility(View.GONE); 
          } 
         }); 
        } 
       }).start(); 



button2.setOnClickListener(new View.OnClickListener() { 
        @Override 
        public void onClick(View v) { 


.............. 


     // Thread.interrupted(); -> does not work 


        } 
       }); 

} }); 

Как я могу сделать button2 слушателя, чтобы прервать нить?

+0

Пробовали ли вы 'Thread.interrupt();'? –

+0

Да, я пробовал, но, как сказал Рандев, не работает с анонимом –

ответ

0

Вместо анонимной реализации потока сделайте поток переменной класса. Предположим, что имя нити - btnOneThread

private Thread btnOneThread; 

Инициализируйте поток там, где это необходимо, и запустите его.

btnOneThread = new Thread(){...} 
btnOneThread.start(); 

Когда button2 щелкают вызов

if (btnOneThread != null) { 
    btnOneThread.interrupt(); 
} 
1
class TestInterruptingThread1 extends Thread{ 
     public void run(){ 
     try{ 
     Thread.sleep(1000); 
     System.out.println("task"); 
     }catch(InterruptedException e){ 
     throw new RuntimeException("Thread interrupted..."+e); 
     } 

     } 

    b2 // 
    { 
    try{ 
     t1.interrupt(); // t1 is the thread to be interrupted 
     }catch(Exception e){System.out.println("Exception handled "+e);} 

     } 
    } 
0

Вызов метода thread.interrupt(). Вам также нужно сохранить экземпляр Thread в поле вашего класса.

0
Thread t = new Thread() {...} 
t.start(); 

и у слушателя:

t.interrupt(); 

Как к

// Thread.interrupted(); -> does not work 

он будет работать внутри класса, производного от нити и будет таким же, как this.interrupted(); t.interrupted() будет работать вне определения класса.

Также отметим, что метод isInterrupted() не очищает флаг прерывания, в то время как interrupted()имеет побочный эффект очистки флага.