我有一项服务需要比较以前和当前的 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);
}
最佳答案
使用报警管理器。你正在让线程 hibernate ,我不确定 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);
}
}
}
另外,你需要在你的 list 中添加这个(当然是用你自己的包):
<service android:name="com.services.MyService"/>
关于java - 服务 ScheduleTask 未按固定时间间隔启动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8702413/