private Handler m_Timer = new Handler();private Runnable r = new Runnable() {  
       
        public void run() {         
        
         for(int i=0;i<m_Observer.size();++i)
         {
         m_Observer.get(i).TimerUpdate(0);
         }
        
         m_Timer.postDelayed(r, 1000);
        }       
    }; public void Stop()
    {
m_Timer.removeCallbacks(r);
    }public void Start()
    {
m_Timer.postDelayed(r, 1000);
    }
执行完Stop()后仍会不停的走Runnable.run();这removeCallbacks到底起啥作用?请教

解决方案 »

  1.   

    removeCallbacks 应该是停止啊,不行的话加个timer吧。
      

  2.   

    要让它停下来的话办法有很多。现在就是想知道在removeCallbacks之后为啥这个handler还能关联到上面的Runnable对象不解
      

  3.   

    这个方法的作用就是在消息队列中把Runnable对象移除
      

  4.   

    你的定时器在start方法中postDelayed(r, 1000)了,然后在线程的run方法中也调用了postDelayed(r, 1000);那这个线程就每隔1000ms就会执行一次,这样重复下去removeCallbacks(r)只是把当前MessageQueue队列中的头消息给移除了
      

  5.   

    首先,removeCallbacks是将MessageQueue中的runnable对象移除
    来看一下你的问题,其实是因为你在调用stop的时候,也就是在removeCallbacks的时候有当前runnable对象的run方法正在执行,所以不可能被remove掉,而run中最后又post了一次,其实也就是在remove后又有了新的runnable对象被加到MessageQueue中去了,也就会继续下面N次run方法的执行了~
      

  6.   


    即是说run方法正在执行时removeCallbacks无法立即生效吗?
      

  7.   

    嗯嗯,是的呢~不过严格符合你的立即生效的话那你就要有多线程喽,不然在你执行你的run的时候不会去执行remove的啦对吧~