Android «пропускает» периодическое выполнение Thread с использованием ScheduledExecutorService - PullRequest
1 голос
/ 25 августа 2010

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

2 голосов
/ 25 августа 2010

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

...