2010-10-14 122 views
1

我想做一組信號強度的測量,所以我想在同一個方法(即返回所需值)執行之間做一個延遲 - value1 ... delay .... value2 .. ..delay ....目前我使用創建的延遲創建測量之間的延遲

Thread.sleep(DELAY); 

這種方式似乎工作,但我的理解它使整個應用程序停止。我瀏覽了Android開發者網站,發現了一些使用Timer和ScheduledExecutorService的其他方法。但我不完全理解如何使用這兩種方式創建延遲。可能有人會有所作爲,給我一些想法或方向,以開始?

回答

3

您可以使用Runnable和處理程序。

private Runnable mUpdateTimeTask = new Runnable() { 
    public void run() { 

     // Get the difference in ms 
     long millis = SystemClock.uptimeMillis() - mStartTime; 

     // Format to hours/minutes/seconds 
     mTimeInSec = (int) (millis/1000); 

     // Do your thing 

     // Update at the next second 
     mHandler.postAtTime(this, mStartTime + ((mTimeInSec + 1) * 1000)); 
    } 
}; 

並配有處理程序啓動這個:

mHandler.postDelayed(mUpdateTimeTask, 100); 

Ofcourse,你必須有一個全球性的mHandler(私人處理器mHandler =新的處理程序())和開始時間(也uptimeMillis)。這會每秒更新一次,但您可以更長時間更改它。 http://developer.android.com/reference/android/os/Handler.html

+0

我有2個問題: 1.你確定我應該使用uptimeMillis作爲StartTime,而不是mStartTime = System.currentTimeMillis(); ? 2.爲什麼你在mHandler.postDelayed中有100個? – StalkerRus 2010-10-21 19:30:01

+0

還有一個問題。你的代碼應該插入OnCreate還是僅僅在主類中? – StalkerRus 2010-10-21 20:07:18

+0

請參閱http://developer.android.com/reference/android/os/SystemClock.html – Barryvdh 2010-10-22 09:16:05

1
java.util.concurrent.Executors.newScheduledThreadPool(1).scheduleAtFixedRate(new java.lang.Runnable() 
{ 
    @Override 
    public void run() 
    { 
    System.out.println("call the method that checks the signal strength here"); 
    } 
    }, 
    1, 
    1, 
    java.util.concurrent.TimeUnit.SECONDS 
); 

這是代碼片段,它會在每1秒初始延遲1秒後調用某些方法。

0

documentation page for ScheduledExecutorService給出瞭如何使用它的一個很好的例子:

import static java.util.concurrent.TimeUnit.*; 
class BeeperControl { 
    private final ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1); 

    public void beepForAnHour() { 
    final Runnable beeper = new Runnable() { 
     public void run() { 
     System.out.println("beep"); 
     } 
    }; 
    // Run the beeper Runnable every 10 seconds after a 10 second wait 
    final ScheduledFuture<?> beeperHandle = scheduler.scheduleAtFixedRate(beeper, 10, 10, SECONDS) ; 

    // Schedule something to cancel the beeper after an hour 
    scheduler.schedule(new Runnable() { 
     public void run() { 
     beeperHandle.cancel(true); 
     } 
    }, 60 * 60, SECONDS); 
    } 
} 
1

要使用定時器創建一個定時器實例

Timer mTimer = new Timer();

現在你想運行可調度的任務。

mTimer.scheduleAtFixedRate(new TimerTask() { 
public void run() { 
//THE TASK 
} 
}, DELAY, PERIOD); 

DELAY =第一次執行之前的時間量(以毫秒爲單位)。

LONG =後續執行之間的時間量(以毫秒爲單位)。

有關更多信息,請參閱here