我有一个服务,需要比较以前和现在的html代码。
我把它配置为每1小时做一次工作,但它实际上是在奇怪的非线性间隔中完成的。我在代码中添加了一个命令,用于编写日志文件,以便查看工作完成的时间。结果很奇怪:有时间隔不到一个小时,有时更长(2-3小时),有时甚至是1小时.编辑:当间隔较短(1分钟)时,它通常运行,这是我的代码:
ScheduledExecutorService executorService = Executors.newSingleThreadScheduledExecutor();
executorService.scheduleWithFixedDelay(new Runnable() {
public void run() {
try {
if (isNetworkAvailable()) {
doServiceWork();
check("SLeEPING!!!", c);
}
else {
check ("NO INTERNET", c);
}
}
catch (Exception e) {check("78", c);}
}
}, 1, 3600, TimeUnit.SECONDS);
}发布于 2012-01-02 19:58:22
使用AlarmManager。您正在使线程睡眠,我不确定Android保证它会那样工作。像这样的东西应该对你有帮助。这将每小时启动一次服务:
PendingIntent serviceIntent= PendingIntent.getService(context,
0, new Intent(context, MyService.class), 0);
long firstTime = SystemClock.elapsedRealtime();
AlarmManager am = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
long currenciesIntervalInSec = 3600;
if (automaticCurrencies)
am.setRepeating(AlarmManager.ELAPSED_REALTIME, firstTime, currenciesIntervalInSec*1000, serviceIntent);编辑:
您应该扩展IntentService。它负责线程,一切都是在后台完成的(如果您需要在后台执行任务,并且不需要同时执行多个线程,那么它特别有用)。当您启动服务时,HandleIntent中的任何内容都将被执行。在内部,它将保留队列的列表。
例如,这是一个简单的服务类(您需要创建两个构造函数):
public class MyService extends IntentService {
public MyService() {
super("MyService");
}
public MyService(String name) {
super(name);
}
@Override
protected void onHandleIntent(Intent arg0) {
if (isNetworkAvailable()) {
doServiceWork();
check("SLeEPING!!!", c);
}
else {
check ("NO INTERNET", c);
}
}
}此外,您还需要将其添加到清单中(当然是使用您自己的包):
<service android:name="com.services.MyService"/> 发布于 2012-01-02 15:22:54
也许你的活动被Android任务管理器破坏了,而不是被定时器关闭。这就是为什么你会得到更短的值。这就是为什么,当设定一个非常低的值时,你不会明白这一点。
您应该了解一下Android如何处理进程和应用程序这里。
https://stackoverflow.com/questions/8702413
复制相似问题