我在应用程序上有一个服务,需要无限期地运行-即使应用程序关闭。它将ping一个网络源,如果状态改变,那么服务必须触发一个通知。触发服务中ping的循环由用户选择,最小值为5000ms(5秒)。我在一个单独的线程(离开UI线程)上有ping,调用处理程序线程将祝词(在编程时临时)发送到UI线程。
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Toast successMessage = Toast.makeText(this, "Service Started", Toast.LENGTH_SHORT);
successMessage.show();
//sendToastOnUIThread(1000);
new Thread(new Runnable(){
public void run() {
while(true) {
try {
Thread.sleep(GLOBAL_PING_TIMER);
} catch (InterruptedException e) {
e.printStackTrace();
}
sendToastOnUIThread();
//Code for pings here...
}
}
}).start();
return START_STICKY;
}
上面你可以看到我的onStartCommand从服务-当测试这个,我只使用了上面的代码,而省略了我的代码ping网络源等。
如果你想知道sendToastOnUIThread();'
public void sendToastOnUIThread(){
Handler h = new Handler(AutoPingServerService.this.getMainLooper());
h.post(new Runnable() {
@Override
public void run() {
Toast.makeText(AutoPingServerService.this,"Servers Pinged",Toast.LENGTH_SHORT).show();
}
});
}
所以当这个服务运行时,我每5秒收到一次祝酒,但服务内存一直在堆积(似乎上限为8.5mb),但从1mb开始,每次循环只增加0.1mb左右。我是不是编了太多的线?应该只有UI线程,处理ping的新线程和处理程序线程,当我需要它们时发布toast(这将被替换为通知,一旦它工作)
开放的想法-相当新的android开发,我不会感到惊讶,如果我使用所有错误的线程类型。这可能是正常的?
编辑:拼写。
好了,给好奇的人更新一下:
内存会在一段时间(pweh)后被擦除,因为您将达到终端容量。不确定这是否理想,但嘿-我不会卖数百万,如果应用程序崩溃,我会更新这篇文章。不要修理没有坏的东西,嗯?
无论如何- @Deev善意地说我应该转移到IntentService,我没有。我可能会在未来,但这个方法工作(虽然它看起来更简单,使用IntentService)。