2015-10-18 25 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