6

我必须在单击开始按钮时开始可运行并在单击暂停按钮时停止它。我的启动按钮单击时可运行的代码是

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

现在我想在暂停按钮单击时停止该可运行

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

        }
    });

如果有人知道请帮助我,我如何在暂停按钮单击时停止该可运行。

4

5 回答 5

14

利用

mHandler.removeCallbacksAndMessages(runnable);

在暂停按钮点击。

于 2013-04-24T09:40:32.647 回答
9

保留一个boolean cancelled标志来存储状态。将其初始化为 false,然后在单击停止按钮时将其修改为 true。

在你的run()方法中继续检查这个标志。

编辑

上述方法通常有效,但仍然不是停止可运行/线程的最合适方法。可能存在任务被阻止并且无法检查标志的情况,如下所示:

     public void run(){
        while(!cancelled){
           //blocking api call
        }
    }

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

替代和安全的方法

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

于 2013-04-24T09:40:23.007 回答
1

完整代码:

   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);
于 2018-06-12T04:52:11.147 回答
0

使用以下代码:

handler.removeCallbacks(runnable);
于 2018-02-21T11:05:23.310 回答
-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();
于 2013-04-24T10:20:34.270 回答