Android «пропускает» периодическое выполнение Thread с использованием ScheduledExecutorService

У меня есть приложение для 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);

Почему это так? Процессор спит и, таким образом, пропускает запланированное выполнение? Я держу в своем приложении частичный пробуждение

1
задан pableu 25 August 2010 в 13:38
поделиться

1 ответ

Я думаю, что вы ищете AlarmManager. См., например, этот вопрос: Android: Как использовать AlarmManager

2
ответ дан 2 September 2019 в 21:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: