0

onCreate() で asynctask を作成するフォアグラウンド サービスがあります。asynctask の doInBackground には がありwhile(true)ます。この関数では、特定のネットワーク操作を実行し、反復ごとにランダムな間隔でスリープ状態になります。ロジックは次のとおりです。

doInBackground(){
     while(true){
         //Do network operation
         //randomNumber is a random number calculated each iteration and is in range of 60-180
         Thread.sleep(randomoNumber*1000);
     }

}

今私の問題は、デバイスがスリープ状態になるとすぐに、asynctask もスリープ状態になることです。ネットワーク操作は、時間間隔 (randomNumber) に固執することが非常に重要であり、randomNumber 秒を超えてスリープする余裕はありません (数秒の差は許容できます)。では、デバイスがアクティブな状態でなくても、Thread.sleep の後に asynctask がウェイクアップすることを保証するにはどうすればよいでしょうか? ウェイクロックを使用できると思いますが、while(true) ループがあるため、タスクが永久に実行され続け、バッテリーが消耗する可能性があります。Thread.sleep の前に使用し、ネットワーク操作の後に解放すると、thread.sleep の後にタスクが起きないという同じ問題が発生する可能性があります。では、ここで何ができるでしょうか?

4

1 に答える 1

0

デバイスがスリープ状態のときでも、CPU を強制的にオンにすることができます。http://developer.android.com/training/scheduling/wakelock.html#cpuを参照してください。

wake lock を使用する正当なケースの 1 つは、画面がオフのときに CPU を実行し続けるために wake lock を取得する必要があるバックグラウンド サービスである可能性があります。

于 2014-05-21T04:25:12.660 に答える