我在应用上有一项服务需要无限期运行 - 即使应用已关闭。它将ping网络源,如果状态发生更改,则服务必须触发通知。用户选择触发服务中的ping的循环,最小值为5000ms(5秒)。我有一个单独的线程(在UI线程之外)ping,调用处理程序线程将toast(编程时暂时)发布到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开发来说相当新,如果我使用所有错误的线程类型,我不会感到惊讶。可能这是正常的吗?
编辑:拼写。
答案 0 :(得分:0)
好好更新任何好奇的人:
一段时间(pweh)内存确实会被擦除,因为你已达到终端容量。不确定这是否理想,但是嘿 - 我不打算以数百万的价格出售它,如果应用程序崩溃,我会更新这篇文章。不要解决那些没有破坏的事情吗?
无论如何 - @Deev友好地说我应该转移到IntentService,但事实并非如此。我可能会在将来,但这种方法有效(尽管使用IntentService看起来确实简单)。