2010-08-25 26 views
1

我有一个Android应用程序,反复收集周围的WiFi网络(科学原因,不侵犯anybodies隐私)的指纹。无论如何,假设我有一个功能可以完成这项工作,它叫做scanWifi()。我initally想象这样开始:安卓“错过”使用ScheduledExecutorService线程定期执行

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

回答

2

我想你要找的是一个AlarmManager。例如,请参阅以下问题:Android: How to use AlarmManager

+0

对不起,接受您的答案需要很长时间。我已经完全忘记了这一点,我认为我的问题是我没有*保持部分唤醒锁,尽管我认为我做了。无论如何,我现在已经获得了部分唤醒锁,并且我的ExecutorService正常工作:-) – pableu 2010-10-14 13:13:51

+1

对于任何想要使用此实现的人,应该注意,从Android 5.1开始AlarmManager不再接受间隔短于60秒的重复性警报。小于此值的任何内容默认为一分钟。 https://code.google.com/p/android/issues/detail?id=161244 – 2015-09-21 09:11:52