服务使用越来越多的内存
Service Uses Increasingly More Memory
我在应用程序上有一项服务需要 运行 无限期地运行 - 即使应用程序已关闭。它将对网络源执行 ping 操作,如果状态发生变化,则该服务必须触发通知。服务中触发 ping 的循环是用户选择的,最小值为 5000 毫秒(5 秒)。我在一个单独的线程(关闭 UI 线程)上有 ping,调用处理程序线程 post toasts(在编程时暂时)到 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();
}
});
}
因此,当此服务 运行ning 时,我每 5 秒就会收到祝酒词,但服务内存一直在堆积(似乎上限为 8.5mb),但开始时大约为 1mb,并且还在不断增加每个循环大约 0.1mb。我是否以某种方式制作了太多线程?应该只有 UI 线程,处理 ping 的新线程和处理程序线程 post toasts 当我需要它们时(这将在它工作后被通知替换)
开放想法 - android 开发相当新,如果我使用了所有错误的线程类型,我不会感到惊讶。这可能是正常的?
编辑:拼写。
好的更新给任何好奇的人:
一段时间后 (pweh) 内存会被擦除,因为您将达到终端容量。不确定这是否理想,但嘿 - 我不会以数百万的价格出售它,如果应用程序崩溃,我会更新此 post。不要修理没坏的东西是吗?
无论如何 - @Deev 亲切地说我应该转移到 IntentService,我没有。我将来可能会,但这种方法有效(尽管使用 IntentService 看起来确实更简单)。
我在应用程序上有一项服务需要 运行 无限期地运行 - 即使应用程序已关闭。它将对网络源执行 ping 操作,如果状态发生变化,则该服务必须触发通知。服务中触发 ping 的循环是用户选择的,最小值为 5000 毫秒(5 秒)。我在一个单独的线程(关闭 UI 线程)上有 ping,调用处理程序线程 post toasts(在编程时暂时)到 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();
}
});
}
因此,当此服务 运行ning 时,我每 5 秒就会收到祝酒词,但服务内存一直在堆积(似乎上限为 8.5mb),但开始时大约为 1mb,并且还在不断增加每个循环大约 0.1mb。我是否以某种方式制作了太多线程?应该只有 UI 线程,处理 ping 的新线程和处理程序线程 post toasts 当我需要它们时(这将在它工作后被通知替换)
开放想法 - android 开发相当新,如果我使用了所有错误的线程类型,我不会感到惊讶。这可能是正常的?
编辑:拼写。
好的更新给任何好奇的人:
一段时间后 (pweh) 内存会被擦除,因为您将达到终端容量。不确定这是否理想,但嘿 - 我不会以数百万的价格出售它,如果应用程序崩溃,我会更新此 post。不要修理没坏的东西是吗?
无论如何 - @Deev 亲切地说我应该转移到 IntentService,我没有。我将来可能会,但这种方法有效(尽管使用 IntentService 看起来确实更简单)。