使用SystemClock.elapsedRealTime()而不是SystemClock.uptimeMillis()的android服务在模拟器中工作但在三星captivate中不起作用?

时间:2010-12-26 18:19:52

标签: android android-emulator

stackoverflow中的第一个问题:)

我正在运行一个小的Android 2.2应用程序来记录cpu频率使用情况。它被设置为一个服务,它将使用新线程每10秒写入一次数据。该部分的代码非常基础(见下文)。

它工作正常,只是在手机睡着时它不会跟踪时间(我知道这是预期的行为)。因此,我将代码更改为使用SystemClock.elapsedRealTime()。问题是,在模拟器中,两个命令都是等价的,但在手机中应用程序将启动线程,但它永远不会执行mHandler.postAtTime命令。关于为什么会发生这种情况或如何克服这个问题的任何建议都非常感谢。

PS:没有调用stopLog()。那不是问题。

    mUpdateTimeTask = new Runnable() {
        public void run() {
            long millis = SystemClock.uptimeMillis() - mStartTime;
            int seconds = (int) (millis / 1000);
            int minutes = seconds / 60;
            seconds     = seconds % 60;

            String freq = readCPU ();
            if (freq == null)
                Toast.makeText(CPU_log_Service.this, "CPU frequency is unreadable.\nPlease make sure the file has read rights.", Toast.LENGTH_LONG).show();
            String str = new String ((minutes*60 + seconds) + ", " + freq + "\n");
            if (!writeLog (str)) stopLog();
            mHandler.postAtTime(this, mStartTime + (((minutes * 60) + seconds + 10) * 1000));
    }};

    mStartTime = SystemClock.uptimeMillis();
    mHandler.removeCallbacks(mUpdateTimeTask);
    mHandler.postDelayed(mUpdateTimeTask, 100);

1 个答案:

答案 0 :(得分:4)

正如文档所述,对于postAtTime(),“时基是uptimeMillis()。”因此,您不能仅仅决定使用elapsedRealTime()

我建议您只使用postDelayed(),以消除整个时间基础问题。