我的服务需要每分钟检查一下
while(true)
{
Thread.sleep(60000)
//REST OF CODE HERE//
}
Run Code Online (Sandbox Code Playgroud)
不管用.使应用程序冻结并要求我强制停止它.
我确定问题在于while循环,但我认为这是在onStart()方法执行时无限重复服务的唯一方法.
任何建议表示赞赏.
编辑
我修复了它,如果你想知道代码是怎么样的那么你去:
@Override
public void onStart(Intent intent, int startId) {
// TODO Auto-generated method stub
super.onStart(intent, startId);
Toast.makeText(this, "Service running", Toast.LENGTH_SHORT).show();
handler = new Handler(){
@Override
public void handleMessage(Message msg) {
// TODO Auto-generated method stub
super.handleMessage(msg);
Toast.makeText(protectionService.this, "5 secs has passed", Toast.LENGTH_SHORT).show();
}
};
new Thread(new Runnable(){
public void run() {
// TODO Auto-generated method stub
while(true)
{
try {
Thread.sleep(5000);
handler.sendEmptyMessage(0);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}).start();
}
Run Code Online (Sandbox Code Playgroud)
基本上,该服务已被调用,在这种情况下,该服务的任务将每5秒重复一次.
我要感谢vineetska,Janusz和inazaruk建议使用Handler.我要感谢所有回答的人,非常感谢你的帮助.
Vin*_*kla 14
在你的服务中创建一个线程并将while循环放在那里:
new Thread(new Runnable(){
public void run() {
// TODO Auto-generated method stub
while(true)
{
Thread.sleep(60000)
//REST OF CODE HERE//
}
}
}).start();
Run Code Online (Sandbox Code Playgroud)
每个生命周期服务方法都是从UI线程调用的.如果您需要一直运行后台任务,可以为此创建新线程.这实际上在文档中有很好的描述.
但是,在您的情况下,您应该考虑使用AlarmManager.它非常好地处理重复事件,专门针对类似场景而设计.
另一种解决方案是使用Handler它的postDelayed()功能.当您的操作(应该每60秒执行一次)不耗时(或者您仍然应该在后台线程中运行)时,可以使用此方法.
总的来说,创建一个一直睡眠的线程对移动设备来说不是一个好的解决方案.这消耗了可能用于更有用的资源的资源.特别是考虑到Android的重复活动的丰富功能.
| 归档时间: |
|
| 查看次数: |
26913 次 |
| 最近记录: |