2010-12-26 7 views
0

ここで最初の質問stackoverflow :)SystemClock.uptimeMillis()の代わりにSystemClock.elapsedRealTime()を使用するアンドロイドサービスはエミュレータでは動作しますが、samsung captivateでは動作しませんか?

私は少しのアンドロイド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); 

答えて

4

postAtTime()ため、 "タイムベース)がuptimeMillis(です。"したがって、ただelapsedRealTime()を使用することを決定することはできません。

タイムベース全体の問題を解決するには、postDelayed()を使用することをお勧めします。

+0

すばやくお返事ありがとうございます。私は最も明白な場所を除いてどこからでも見ていました。私はログが丸数字(純粋に美学)から漂っていないことを確認するのがより簡単になるので、postAtTime()バリアントを好んでいました。私は10秒の倍数を強制するいくつかのオプションを思いついてみましたが、これまでは動作しませんでした。 – Aleadam

関連する問題