私は、周囲のwifiネットワークから指紋を繰り返し収集するAndroidアプリを持っています(科学的な理由から、誰のプライバシーも侵害しないためです)。
とにかく、この作業を行う関数があり、それがscanWifi()と呼ばれていると想像してください。私は当初、次のように開始したかったのです。
ExecutorService mExecutor = Executors.newSingleThreadScheduledExecutor();
mExecutor.scheduleAtFixedRate(new Runnable() {
@Override
public void run() {
scanWifi();
}
}, 0, interval, TimeUnit.MILLISECONDS);
悲しいことに、これは電話が差し込まれている場合にのみ確実に機能します。差し込まれてしばらくそこに置かれていると、毎分 scanWifi() 関数が実行されません。scanWifi() への 1 回の呼び出しの間に数分のギャップが生じることがあります。
また、Timer/TimerTask を使用して同じことを試みましたが、同様の結果が得られませんでした。
これまで多かれ少なかれ確実に動作しているように見える唯一のことは、次のようにハンドラーに投稿して繰り返し呼び出すことです。
Handler h = new Handler();
Runnable r = new Runnable() {
@Override
public void run() {
if (!mIsStopped) {
scanWifi();
h.postDelayed(this, mInterval);
}
}
};
h.post(r);
なぜそうなのですか?CPU がスリープしているため、スケジュールされた実行に失敗していますか? アプリで部分的なウェイクロックを保持しています。