如何循环服务?

Bat*_*tzi 13 service android

我的服务需要每分钟检查一下

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)


ina*_*ruk 5

每个生命周期服务方法都是从UI线程调用的.如果您需要一直运行后台任务,可以为此创建新线程.这实际上在文档中有很好的描述.

但是,在您的情况下,您应该考虑使用AlarmManager.它非常好地处理重复事件,专门针对类似场景而设计.

另一种解决方案是使用Handler它的postDelayed()功能.当您的操作(应该每60秒执行一次)不耗时(或者您仍然应该在后台线程中运行)时,可以使用此方法.

总的来说,创建一个一直睡眠的线程对移动设备来说不是一个好的解决方案.这消耗了可能用于更有用的资源的资源.特别是考虑到Android的重复活动的丰富功能.