我必须在启动按钮单击时启动runnable并在单击暂停按钮时停止它。 我在开始按钮单击时开始运行的代码是
// TODO Auto-generated method stub
//while (running) {
mUpdateTime = new Runnable() {
public void run() {
sec += 1;
if(sec >= 60) {
sec = 0;
min += 1;
if (min >= 60) {
min = 0;
hour += 1;
}
}
Min_txtvw.setText(String.format(mTimeFormat, hour, min, sec));
mHandler.postDelayed(mUpdateTime, 1000);
}
};
mHandler.postDelayed(mUpdateTime, 1000);
//}
现在我想停止暂停按钮上的runnable点击
pause_btn.setOnClickListener(new OnClickListener(){
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
play_btn.setVisibility(View.VISIBLE);
pause_btn.setVisibility(View.INVISIBLE);
}
});
如果有人知道请帮帮我,如何停止暂停按钮点击的可运行。
答案 0 :(得分:13)
使用
mHandler.removeCallbacksAndMessages(runnable);
在暂停按钮中单击。
答案 1 :(得分:8)
保留boolean cancelled
标志以存储状态。将其初始化为false,然后单击“停止”按钮将其修改为true。
在run()
方法中,继续检查此标记。
修改强>
以上方法通常但仍然不是停止可运行/线程的最合适方法。可能存在任务被阻止而无法检查标志的情况,如下所示:
public void run(){
while(!cancelled){
//blocking api call
}
}
假设该任务正在进行阻止api调用,然后修改了取消的标志。只要阻止API调用正在进行,任务就无法检查状态的变化。
替代方案和安全方法
停止线程或任务(Runnable)的最可靠方法是使用中断机制。中断是一种合作机制,可确保停止线程不会使其处于不一致状态 在我的博客上,我已经详细讨论过中断link。
答案 2 :(得分:2)
完整代码:
iterationCount = 0;
final Handler handler = new Handler();
final int delay = 1000; //milliseconds
handler.postDelayed(new Runnable() {
public void run() {
//do something
if (iterationCount < 10) {
handler.postDelayed(this, delay);
}
iterationCount++;
Log.e("tag", "after 1 second: " + iterationCount);
}
}, delay);
答案 3 :(得分:0)
使用以下代码:
handler.removeCallbacks(runnable);
答案 4 :(得分:-2)
螺纹螺纹;
//内部开始按钮
thread=new Thread(new Runnable() {
@Override
public void run() {
sec += 1;
if(sec >= 60) {
sec = 0;
min += 1;
if (min >= 60) {
min = 0;
hour += 1;
}
}
Min_txtvw.setText(String.format(mTimeFormat, hour, min, sec));
mHandler.postDelayed(mUpdateTime, 1000);
});
thread.start();
//在停止按钮内
mHandler.removeCallbacksAndMessages(runnable);
thread.stop();