У меня есть приложение, которое нужно запускать неограниченное время - даже когда приложение закрыто. Он будет пинговать сетевой источник, если состояние изменится, служба должна инициировать уведомление. Цикл, запускающий пинги в сервисе, выбирается пользователем с наименьшим значением 5000 мс (5 секунд). У меня есть пинги на отдельном потоке (с потоком пользовательского интерфейса) с призывами к потоку обработчика для публикации тостов (временно во время программирования) в поток пользовательского интерфейса.Сервис использует все больше памяти
@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 от службы - при тестировании этого я использовал только код, указанный выше, и оставил мой код для пинг источника сети и т.д.
Incase вы удивляетесь, что там в «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), но начинается около 1 Мб и просто создает вокруг 0.1Mb за цикл. Я как-то делаю слишком много потоков? Там должен быть только поток пользовательского интерфейса, новый поток для обработки писем и поток обработчика, чтобы отправлять тосты, когда они мне понадобятся (это будет заменяться уведомлениями, когда он будет работать)
Открыт для идей - довольно новый для разработки Android , Я бы не удивился, если бы использовал все неправильные типы потоков. Возможно, это нормально?
EDIT: Правописание.
Моя первоначальная мысль - сборщик мусора просто не запускается, поэтому он не собирает ваши ссылки на объекты, которые создаются в каждом цикле. Если это так, вы должны увидеть падение через определенное количество времени. В любом случае вы можете захотеть заглянуть в «IntentService». – DeeV
@DeeV Единственная причина, по которой я остался в стороне от IntentService, состоял в том, что (из того, что я читал) классу Service легче поддерживать постоянство и больше предназначено для фактических вычислений, когда IntentService предназначался для служб для намерения, а не когда приложение закрыто , также не IntentService только для небольших рабочих мест? эта работа должна работать 24 часа в сутки. – AndroidStudent
Не уверен, что это ваша проблема, но я не думаю, что вы хотите создать новый обработчик каждый раз, когда вы отправляете тост в поток пользовательского интерфейса. Кстати, что произойдет, если вы в какой-то момент явно вызовите System.gc()? – EJoshuaS