2013-04-24 65 views
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); 
    //} 

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

pause_btn.setOnClickListener(新OnClickListener(){

 @Override 
     public void onClick(View v) { 
      // TODO Auto-generated method stub 
      play_btn.setVisibility(View.VISIBLE); 
      pause_btn.setVisibility(View.INVISIBLE); 

     } 
    }); 

如何我可以停止运行的上暂停按钮点击,如果有人知道,请帮助我。

+1

的可能的复制[安卓:我如何停止的Runnable( http://stackoverflow.com/questions/9458097/android-how-do-i-stop-runnable) – 2016-05-12 09:52:35

回答

12

使用

mHandler.removeCallbacksAndMessages(runnable); 

在暂停按钮点击。

+7

这不会停止正在进行的操作。 – Gusdor 2013-04-24 09:46:00

7

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

而且你run()方法内继续检查该标志。

编辑

上述方法通常但仍然没有工作最合适的方式来阻止可运行/线程。有可能是其中任务被阻塞的情况,并不能检查标志,如下图所示:

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

假定任务正在阻塞的API调用,然后取消标志被修改。只要阻塞API调用正在进行,任务将无法检查状态更改。

替代和安全的方法

最可靠的方式来停止一个线程或任务(Runnable接口)是使用中断机制。中断是一种合作机制,以确保停止线程不会使其处于不一致的状态。
在我的博客,我已经详细讨论了中断,link

+1

AFAIK,这是关闭异步操作的最佳方法。它不是免费的(操作必须轮询该标志),但它允许操作在其自己的时间结束a)和b)清理其所有资源。我经常看到的方法就是放弃一个线程 - 这是一种非常危险的做法。 通过一切手段,继承自己的Runnable并声明此标志以供重用! – Gusdor 2013-04-24 09:43:55

+0

如果在线程之间没有共享任何内容(没有基本类型,对象等),并且在停止时清除,则没有问题。 – stephen 2013-09-07 06:37:15

-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(); 
+1

除了回答问题之外,在示例中使用Thread中的Runnable的目的是什么? – 2015-01-07 09:32:10

0

使用下面的代码:

handler.removeCallbacks(runnable);