У меня есть приложение для Android, которое неоднократно собирает отпечатки пальцев с окружающих Wi-Fi-сетей (по научным причинам, чтобы не вторгаться в личную жизнь).
В любом случае, представьте, у меня есть функция, которая выполняет эту работу, и она называется scanWifi () . Изначально я хотел начать так:
ExecutorService mExecutor = Executors.newSingleThreadScheduledExecutor();
mExecutor.scheduleAtFixedRate(new Runnable() {
@Override
public void run() {
scanWifi();
}
}, 0, interval, TimeUnit.MILLISECONDS);
К сожалению, это работает надежно только тогда, когда телефон подключен. Если он подключен и некоторое время находится там, он не запускает мою функцию scanWifi () каждую минуту. Иногда между одиночными вызовами scanWifi () возникают промежутки в несколько минут.
Я также пытался сделать то же самое, используя Timer / TimerTask с такими же плохими результатами.
Единственное, что до сих пор кажется более или менее надежным, - это отправить его обработчику и повторно вызывать его, например:
Handler h = new Handler();
Runnable r = new Runnable() {
@Override
public void run() {
if (!mIsStopped) {
scanWifi();
h.postDelayed(this, mInterval);
}
}
};
h.post(r);
Почему это так? Процессор спит и, следовательно, пропускает запланированное выполнение? Я держу в своем приложении частичный пробуждение .