我有一项服务需要比较以前和当前的HTML代码。
我已将其配置为每1小时完成一次工作,但实际上它是以奇怪的非线性间隔进行的。我已经在代码中添加了一个编写日志文件的命令,以便在工作完成时查看。结果很奇怪:有时间隔不到一小时,有时甚至更长(2-3小时),有时真的是1小时...... 编辑:当间隔时间较短(1分钟)时,它会正常运行< / strong>这是我的代码:
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);
}
答案 0 :(得分:1)
使用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"/>
答案 1 :(得分:0)
也许您的活动被Android任务管理器破坏,并且计时器没有关闭它。这就是为什么你得到更短的价值。这就是为什么,当设置一个非常低的值时,你不会得到它。
您应该了解Android如何处理流程和应用程序here。