【发布时间】:2012-08-26 12:02:58
【问题描述】:
我们开发了一个 Android 应用程序,其中涉及后台服务。为了实现这个后台服务,我们使用了IntentService。我们希望应用程序每隔60 seconds 轮询一次服务器。所以在IntentService 中,服务器在while 循环中被轮询。在 while 循环结束时,我们使用了 Thread.sleep(60000),因此下一次迭代仅在 60 秒后开始。
但在 Logcat 中,我看到有时应用程序需要超过 5 分钟才能唤醒(从睡眠中走出来并开始下一次迭代)。它永远不是我们想要的1 minute。
这是什么原因?后台服务是否应该以不同的方式实现?
问题2
Android 会在一段时间后终止此后台进程(意图服务)。不能确切地说是什么时候。但有时在后台服务被杀死之前的几个小时甚至几天。如果您能告诉我这样做的原因,我将不胜感激。因为服务不应该被杀死。只要我们愿意,它们就会在后台运行。
代码:
@Override
protected void onHandleIntent(Intent intent) {
boolean temp=true;
while(temp==true) {
try {
//connect to the server
//get the data and store it in the sqlite data base
}
catch(Exception e) {
Log.v("Exception", "in while loop : "+e.toString());
}
//Sleep for 60 seconds
Log.v("Sleeping", "Sleeping");
Thread.sleep(60000);
Log.v("Woke up", "Woke up");
//After this a value is extracted from a table
final Cursor cur=db.query("run_in_bg", null, null, null, null, null, null);
cur.moveToLast();
String present_value=cur.getString(0);
if(present_value==null) {
//Do nothing, let the while loop continue
}
else if( present_value.equals("false") || present_value.equals("False") ) {
//break out of the while loop
db.close();
temp=false;
Log.v("run_in_bg", "false");
Log.v("run_in_bg", "exiting while loop");
break;
}
}
}
但是每当服务被杀死时,它都会在进程处于睡眠状态时发生。最后一条日志读取 - Sleeping : Sleeping。为什么服务会被杀死?
【问题讨论】:
-
您应该改用
Timer并以固定速率安排它,而不是在while 循环中使用Thread.sleep()。 -
因为它们允许您完全按照自己的意愿去做 - 以一定的时间间隔重复一项任务。不一定是您问题的答案,而是一个建议(因此我要发表评论,而不是答案)。也总是有可能使用
Thread.sleep()是它需要 5 分钟的原因 - 也许Timer可能做不到?我觉得值得一试。 -
@Ashwin:如果你能分享这个问题的解决方案,那就太好了。我一直面临一个这样的问题,但是,这里建议的解决方案似乎都没有奏效。
-
@User11012 : 你的问题到底是什么?
-
@Ashwin:我需要每分钟执行一个函数。此功能正在从应用程序向服务器发出 POST 调用,并每分钟传输用户的位置。位置坐标会传输几个小时,但是,几个小时后,位置坐标到服务器的传输会自行停止。代码已在此链接共享:stackoverflow.com/questions/30334215/…