2011-07-19 111 views
1

這是我的計時器類,這個類被設計爲不斷更新視圖中的計時器。但是,當我運行應用程序時,第一個Toast消息顯示在屏幕上,但第二個永遠不會到達(timerTask的「run」方法從未執行)。我知道這可能很簡單,我做錯了。如果任何人都能引導我進入正確的方向,那將會很棒。TimerTask沒有執行?

public class MyTimer { 

static Timer _timerTask = new Timer(); 
static int totalSeconds = 1, hour = 0, min = 0, sec = 0; 
static String mTimeFormat = "%02d:%02d:%02d"; 
static String timeTakenString; 



public static void start(){ 
    Toast.makeText(GPSMain.context, "Message one", Toast.LENGTH_LONG).show(); 

    TimerTask timer = new TimerTask() { 
     @Override 
     public void run() { 
      Toast.makeText(GPSMain.context, "Message two", Toast.LENGTH_LONG).show(); 
      totalSeconds += 1; 
      sec += 1; 
      if(sec >= 60) { 
       sec = 0; 
       min += 1; 
       if (min >= 60) { 
        min = 0; 
        hour += 1; 
       } 
      } 
      timeTakenString = String.format(mTimeFormat, hour, min, sec); 
      postExecute.sendEmptyMessage(0); //update UI 
     } 
     private Handler postExecute = new Handler(){ 
      public void dispatchMessage(Message msg) { 
       super.dispatchMessage(msg); 
       GPSMain.timer.setText("Time Taken: "+timeTakenString); 
      } 
     }; 
    }; 
_timerTask.scheduleAtFixedRate(timer,1000,1000); 
} 
} 

代碼在另一個文件中調用這個類:

MyTimer myTimer = new MyTimer(); 
.... 
myTimer.start(); 

項目SPEC變了! 我的項目負責人更改了項目的規格,以便不再需要將定時器更新到UI,而是將其顯示爲最終結果。無論如何接受第一個答案,因爲它解決了原來的問題。將在下面發佈新代碼。

新代碼調用:

System.currentTimeMillis(); 

在runcycle,它返回一個長的beggining和結束。然後從第二個值中減去第一個值以計算執行運行週期所用的時間量。然後將該值操縱並放入一個以字符串形式顯示在末尾的計時器格式。

public static String getTimeTaken(long end, long start){ 
    @SuppressWarnings("unused") 
    String formattedTime = "", hourHour = "", hourMin = ":", minSec = ":"; 
    long timeTaken = (end-start)/1000, hour = 0, min = 0, sec = 0; 
    if (timeTaken>9){ 
     hourHour = "0"; 
     hourMin = ":0"; 
     if (timeTaken>=60){ 
      if (timeTaken>= 3200){ 
       hour = timeTaken/3200; 
       timeTaken = timeTaken%3200; 
       if (hour>9){ 
        hourHour = ""; 
       } 
      } 
      min = timeTaken/60; 
      timeTaken = timeTaken%60; 
      if (min >9){ 
       hourMin = ":"; 
      } 
     } 
     sec = timeTaken; 
     if(sec%60<10){ 
      minSec = ":0"; 
     } 
     return formattedTime = (hourHour+hour+hourMin+min+minSec+sec); 
    } 
    sec = timeTaken; 
    minSec = ":0"; 
    hourMin = ":0"; 
    hourHour = "0"; 
    return formattedTime = (hourHour+hour+hourMin+min+minSec+sec); 
} 

回答

2

使用線程,你不能更新你的UI的,你必須使用runOnUiThread

youractivity.this.runOnUiThread(new Runnable(){public void run(){Toast.makeText(mContext, "Message", Toast.LENGTH_LONG).show();}}); 
+0

謝謝,但你有任何想法,爲什麼運行方法不工作?如果你找到我,它甚至不會啓動計時器?所以在當前狀態下的代碼我沒有任何更新到UI – Ian

0

(很晚了......以防萬一回答別人達到這個問題...計劃任務沒有按」 t保證它會運行在適當的時間...它可能需要更長的時間,有時更長...)