2015-10-18 68 views
-1

我需要大约5秒的延迟。我已用定时器使用以下代码的尝试:带有延迟的TimerTask/Handler多次调用

  Timer myTimer = new Timer(); 
       myTimer.schedule(new TimerTask() { 
        @Override 
        public void run() { 

         Log.d(TAG,"Timer"); 
        } 

       }, 4000, 5000); 

当我检查日志,则定时器被越来越印刷三次。如果我改变时间,有时也会在日志中打印4次

我一直在使用处理器尝试以及象下面这样:

final Handler mHandler = new Handler(); 
       new Thread(new Runnable() { 
        @Override 
        public void run() { 
         // TODO Auto-generated method stub 
         while (true) { 
          try { 
           Thread.sleep(10000); 
           mHandler.post(new Runnable() { 

            @Override 
            public void run() { 
             // TODO Auto-generated method stub 

              Log.d(Utility.TAG,"Sleep::"); 

            } 
           }); 
          } catch (Exception e) { 
           // TODO: handle exception 
          } 
         } 
        } 
       }).start(); 

但同样的日志印刷多次。我只是想不多次调用我的方法。我怎样才能实现它?

编辑

没有线程使用处理器以及象下面这样:

final Handler h = new Handler(); 
       final int delay = 3000; //milliseconds 

       h.postDelayed(new Runnable(){ 
        public void run(){ 
         //do something 
         h.postDelayed(this, delay); 
         Log.d(Utility.TAG,"Sleep ::"); 
        } 
       }, delay); 

但同样,日志是越来越印刷三次

+0

只使用一个'Handler'没有任何线程 – pskink

+0

哪里是'最后的处理程序H =新的处理程序();'在你的代码?添加'Log.d(Utility.TAG,“Start ::”);'看它什么时候叫 – pskink

+0

@pskink我编辑过这个问题。你可以看到,我已经定义了最后的Handler h。它正在图像的点击监听器中被调用。 – BLEdevices

回答

0

你的第三个方法(没有Timer,没有Thread )是最接近正确的。它会多次打印,因为Runnable每次运行时都会重新发布。如果你只希望它运行一次,从run()方法删除此行:

h.postDelayed(this, delay); 
+0

我已经删除了,但它仍然被称为多次。 – BLEdevices