Android-сервис, использующий SystemClock.elapsedRealTime () вместо SystemClock.uptimeMillis (), работает в эмуляторе, но не в Samsung Captivate? - PullRequest
0 голосов
/ 26 декабря 2010

Первый вопрос здесь в stackoverflow:)

Я запускаю небольшое приложение для Android 2.2 для регистрации использования частоты процессора. Он настроен как сервис, который будет записывать данные каждые 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 Ответ

4 голосов
/ 26 декабря 2010

Как указано в документации, для postAtTime() «Временной базой является uptimeMillis ()».Следовательно, вы не можете просто решить использовать elapsedRealTime().

Я бы порекомендовал вам просто использовать postDelayed(), чтобы устранить всю временную проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...