我需要在30秒后或任何时候单击按钮时停止run()线程。我的问题是如何阻止public void run()。
@Override
public void run() {
// TODO Auto-generated method stub
int currentPosition= 0;
int total = mp.getDuration();
while (mp!=null && currentPosition<total) {
try {
Thread.sleep(1000);
currentPosition= mp.getCurrentPosition();
} catch (InterruptedException e) {
return;
} catch (Exception e) {
return;
}
sbMusicProgress.setProgress(currentPosition);
/*MP3 PROGRESS*/
timer_count++;
runOnUiThread(new Runnable() {
public void run() {
if (timer_count<10)
context.txMp3Prog.setText("00:0"+String.valueOf(timer_count));
//Stop playlist after 30seconds
else if (timer_count==30){
timer_count=0;
context.txMp3Prog.setText("00:00");
mp.pause();
sbMusicProgress.setProgress(0);
btPlayMp3.setBackgroundResource(R.drawable.air_deezer_play);
}
else
context.txMp3Prog.setText("00:"+String.valueOf(timer_count));
}
});
}
}
答案 0 :(得分:1)
您可以在线程上调用interrupt
。
http://developer.android.com/reference/java/lang/Thread.html
public void interrupt ()
向此线程发布中断请求。行为取决于此线程的状态:
在一个Object的wait()方法或一个Thread的join()或sleep()方法中被阻塞的线程将被唤醒,它们的中断状态将被清除,并且它们会收到InterruptedException。
在InterruptibleChannel的I / O操作中被阻塞的线程将设置其中断状态并接收ClosedByInterruptException。此外,该频道将被关闭。
在Selector中阻塞的线程将设置其中断状态并立即返回。在这种情况下,他们不会收到例外。
我建议您使用Handler
。
int count =30;
Handler m_handler;
Runnable m_handlerTask ;
m_handlerTask = new Runnable()
{
@Override
public void run() {
if(count>=0)
{
// do something
count--;
}
else
{
m_handler.removeCallbacks(m_handlerTask); // cancel the run
}
m_handler.postDelayed(m_handlerTask, 1000);
}
};
m_handlerTask.run();
public final void removeCallbacks (Runnable r)
删除邮件队列中的Runnable r的所有待处理帖子。
答案 1 :(得分:0)
我想提到的第一件事是不推荐使用stop()
线程方法。
So what is the good practice to stop a thread?
答。你是否必须通过完成特定线程的run()
方法来完成线程的生命周期。
在您的情况下,请尝试在30秒后或点击按钮后按run()
完成setting one flag variable
方法。
@Raghunandan提到的第二个解决方案。
尝试this link这是oracle doc,他们解释了线程中断。