我有一个 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 是否处于休眠状态并因此错过了预定的执行?我在我的应用程序中持有部分唤醒锁。