TimerTask没有执行?

时间:2011-07-19 10:42:30

标签: java android timer timertask

这是我的计时器类,该类旨在不断更新视图中的计时器。但是,当我运行应用程序时,第一个toast消息显示在屏幕上但第二个消息永远不会到达(timerTask的“run”方法永远不会被执行)。我知道这可能是一件很简单的事情,我做错了。如果有人能引导我走向正确的方向,那就太好了。

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();

项目规格变了! 我的项目负责人更改了项目的规范,因此不再需要将计时器更新到UI,而是将其显示为最终结果。无论如何接受第一个答案,因为它解决了原始问题。将在下面发布新代码。

新代码调用:

 System.currentTimeMillis();

在runcycle的开始和结束时返回一个long。然后从第二个值中减去第一个值,以计算执行运行周期所需的时间。然后操纵该值并将其置于计时器格式中,该格式在结尾处显示为字符串。

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 个答案:

答案 0 :(得分:2)

使用线程,您无法更新UI,因为您必须使用runOnUiThread

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

答案 1 :(得分:0)

(很晚......只是回答以防有人达到这个问题......安排一项任务并不保证它会在适当的时间运行......可能需要更长时间,有时甚至更长......)< / p>