1

我有一个 android 应用程序,它反复从周围的 wifi 网络收集指纹(出于科学原因,不侵犯任何人的隐私)。

无论如何,想象一下我有一个可以完成这项工作的函数,它被称为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);

为什么会这样?CPU 是否处于休眠状态并因此错过了预定的执行?我在我的应用程序中持有部分唤醒锁

4

1 回答 1

2

我认为您正在寻找的是AlarmManager。例如,请参阅以下问题:Android:如何使用 AlarmManager

于 2010-08-25T16:19:10.863 回答