如何在Android按钮点击时停止Runnable?

Raj*_*Raj 6 android

我必须在启动按钮单击时启动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);
    //}
Run Code Online (Sandbox Code Playgroud)

现在我想在暂停按钮点击停止运行

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);

        }
    });
Run Code Online (Sandbox Code Playgroud)

如果有人知道请帮助我,如何停止暂停按钮单击运行.

Aru*_*n C 14

使用

mHandler.removeCallbacksAndMessages(runnable);
Run Code Online (Sandbox Code Playgroud)

在暂停按钮单击.

  • 这不会阻止正在进行的操作. (12认同)

rai*_*mar 8

保持boolean cancelled存储状态的标志.将其初始化为false,然后单击"停止"按钮将其修改为true.

在你的run()方法里面继续检查这个标志.

编辑

上面的方法通常起作用,但仍然不是停止runnable/thread的最合适的方法.可能存在任务被阻止而无法检查标志的情况,如下所示:

     public void run(){
        while(!cancelled){
           //blocking api call
        }
    }
Run Code Online (Sandbox Code Playgroud)

假设任务正在进行阻塞api调用,然后修改了取消的标志.只要阻止API调用正在进行,任务就无法检查状态的变化.

替代和安全的方法

停止线程或任务(Runnable)的最可靠方法是使用中断机制.中断是一种合作机制,可确保停止线程不会使其处于不一致状态.
在我的博客上,我已经详细讨论过中断,链接.