Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/195.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何利用定时器为工作服务?_Java_Android - Fatal编程技术网

Java 如何利用定时器为工作服务?

Java 如何利用定时器为工作服务?,java,android,Java,Android,我有以下任务:使服务每10分钟执行一次并从互联网上获取数据。我尝试使用组合服务+计时器,但在这种情况下,我无法控制服务(我在服务的onCreate()方法中延迟执行TimerTask,当我中断服务时,TimerTask不会停止)。我只需要2个按钮:“开始服务”和“停止服务”。在这种情况下,最好的方法是什么?谢谢你的帮助 如果我很了解你,你想知道当你中断服务时如何停止计时器任务吗?! 如果是,请继续阅读,否则请更好地解释 要停止TimerTask再次执行(假设它被安排重复运行),必须调用cance

我有以下任务:使服务每10分钟执行一次并从互联网上获取数据。我尝试使用组合服务+计时器,但在这种情况下,我无法控制服务(我在服务的onCreate()方法中延迟执行TimerTask,当我中断服务时,TimerTask不会停止)。我只需要2个按钮:“开始服务”和“停止服务”。在这种情况下,最好的方法是什么?谢谢你的帮助

如果我很了解你,你想知道当你中断服务时如何停止计时器任务吗?! 如果是,请继续阅读,否则请更好地解释

要停止TimerTask再次执行(假设它被安排重复运行),必须调用cancel()方法。首选的方法是让TimerTask本身在检查一些可以在外部设置的布尔标志后调用cancel()方法

例如:

class MyTimerTask extends TimerTask() {

    private boolean alive = true;

    public void run() {
        if (alive) {
            // do something
        } else {
            cancel();
        }
    }

    public void stop() {
        alive = false;
    }
}

然后,很明显,当您中断服务时,只需调用MyTimerTask.stop()。

您应该使用AlarmManager。请参阅此问题以获取有关此问题的帮助。没有必要浪费用户的内存,让您的服务保持10分钟不做任何事情。此外,如果手机处于休眠状态,计时器将不会运行。使用AlarmManager,手机将每10分钟自动唤醒一次,您的服务将被调用以执行其internet下载任务

您需要使用AlarmManager。看到这个问题了,谢谢。但是为什么我不能使用定时器呢?没有必要浪费用户的内存,让你的服务保持10分钟不做任何事情。此外,如果手机处于休眠状态,计时器将不会运行。通过使用AlarmManager,手机将每10分钟自动唤醒一次,您的服务将被呼叫以执行其internet下载任务。谢谢。请回答,我会记下来。谢谢你的回复。我试图更好地解释:我执行服务,并在服务的onCreate()方法中执行timer(类的成员)timer.scheduleAtFixedRate(..)。然后服务执行服务的onDestroy()方法,但计时器仍然工作。很好,我需要每5分钟检查一次网络服务。但如果我已经停止服务,我怎么能停止计时器呢?或者我如何组织每5分钟检查一次web服务?根据您的说法,Timertask应该在您终止服务后继续存在。。。。因此,它必须不是服务的成员。将TimerTask引用保留在可以一直运行的某个类中。如果你没有一个一直运行的类,那么创建一个。。。您可能应该为此启动一个新线程。。。也就是说,如果你发布了一些演示代码,那么纠正错误就容易多了。