【发布时间】:2011-04-03 17:49:42
【问题描述】:
我有一个 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 是否处于休眠状态并因此错过了预定的执行?我在我的应用中持有partial wakelock。
【问题讨论】:
标签: android threadpool executorservice