Android 安卓;“未命中”;使用ScheduledExecutorService定期执行线程
我有一个android应用程序,它可以反复从周围的wifi网络收集指纹(出于科学原因,不侵犯任何人的隐私) 无论如何,假设我有一个函数可以完成这项工作,它叫做scanWifi()。我最初想这样开始:Android 安卓;“未命中”;使用ScheduledExecutorService定期执行线程,android,threadpool,executorservice,Android,Threadpool,Executorservice,我有一个android应用程序,它可以反复从周围的wifi网络收集指纹(出于科学原因,不侵犯任何人的隐私) 无论如何,假设我有一个函数可以完成这项工作,它叫做scanWifi()。我最初想这样开始: ExecutorService mExecutor = Executors.newSingleThreadScheduledExecutor(); mExecutor.scheduleAtFixedRate(new Runnable() { @Override public voi
ExecutorService mExecutor = Executors.newSingleThreadScheduledExecutor();
mExecutor.scheduleAtFixedRate(new Runnable() {
@Override
public void run() {
scanWifi();
}
}, 0, interval, TimeUnit.MILLISECONDS);
Handler h = new Handler();
Runnable r = new Runnable() {
@Override
public void run() {
if (!mIsStopped) {
scanWifi();
h.postDelayed(this, mInterval);
}
}
};
h.post(r);
可悲的是,这只在手机插上电源后才能可靠工作。如果它插上电源并在那里放置一段时间,它不会每分钟都运行scanWifi()函数。有时,对scanWifi()的单个呼叫之间会有几分钟的间隔
我也尝试过使用计时器/计时器任务来做同样的事情,但结果同样糟糕
到目前为止,唯一一种工作或多或少可靠的方法是将其发送给处理程序并重复调用,如下所示:
ExecutorService mExecutor = Executors.newSingleThreadScheduledExecutor();
mExecutor.scheduleAtFixedRate(new Runnable() {
@Override
public void run() {
scanWifi();
}
}, 0, interval, TimeUnit.MILLISECONDS);
Handler h = new Handler();
Runnable r = new Runnable() {
@Override
public void run() {
if (!mIsStopped) {
scanWifi();
h.postDelayed(this, mInterval);
}
}
};
h.post(r);
为什么会这样?CPU是否处于休眠状态,从而错过计划的执行?我在我的应用程序中有一个按钮。我想你要找的是AlarmManager。例如,请参见以下问题:很抱歉,您花了这么长时间才接受您的答案。我已经完全忘记了这一点,我想我的问题是我没有持有部分唤醒锁,尽管我认为我持有。无论如何,我现在已经获得了部分wakelock,我的ExecutorService工作正常:-)对于任何希望使用此实现的人,应该注意,从Android 5.1 AlarmManager开始,不再接受间隔小于60秒的重复报警。任何小于该值的值都默认为一分钟。