【问题标题】:Android "misses" periodical execution of Thread using ScheduledExecutorServiceAndroid“错过”使用 ScheduledExecutorService 定期执行线程
【发布时间】: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


    【解决方案1】:

    我认为您正在寻找的是一个 AlarmManager。例如,请参阅以下问题:Android: How to use AlarmManager

    【讨论】:

    • 很抱歉花了这么长时间才接受您的回答。我完全忘记了这一点,我认为我的问题是我没有没有持有部分唤醒锁,尽管我认为我做到了。无论如何,我现在已经获得了部分唤醒锁,并且我的 ExecutorService 可以正常工作:-)
    • 对于希望使用此实现的任何人都应该注意,从 Android 5.1 开始,AlarmManager 不再接受间隔短于 60 秒的重复警报。小于该值的任何内容都默认为一分钟。 code.google.com/p/android/issues/detail?id=161244
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多