2016-08-11 2 views
0

У меня есть приложение, которое нужно запускать неограниченное время - даже когда приложение закрыто. Он будет пинговать сетевой источник, если состояние изменится, служба должна инициировать уведомление. Цикл, запускающий пинги в сервисе, выбирается пользователем с наименьшим значением 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: Правописание.

+0

Моя первоначальная мысль - сборщик мусора просто не запускается, поэтому он не собирает ваши ссылки на объекты, которые создаются в каждом цикле. Если это так, вы должны увидеть падение через определенное количество времени. В любом случае вы можете захотеть заглянуть в «IntentService». – DeeV

+0

@DeeV Единственная причина, по которой я остался в стороне от IntentService, состоял в том, что (из того, что я читал) классу Service легче поддерживать постоянство и больше предназначено для фактических вычислений, когда IntentService предназначался для служб для намерения, а не когда приложение закрыто , также не IntentService только для небольших рабочих мест? эта работа должна работать 24 часа в сутки. – AndroidStudent

+0

Не уверен, что это ваша проблема, но я не думаю, что вы хотите создать новый обработчик каждый раз, когда вы отправляете тост в поток пользовательского интерфейса. Кстати, что произойдет, если вы в какой-то момент явно вызовите System.gc()? – EJoshuaS

ответ

0

Хорошо обновление для любого любопытного:

память действительно становится вытерла через некоторое время (pweh), как вы достигнете пропускную способность терминала. Не уверен, что это идеально, но эй - я не собираюсь продавать его за миллионы, если приложение выйдет из строя, я обновлю этот пост. Не исправить то, что не сломано?

В любом случае - @Deev любезно сказал, что я должен перейти в IntentService, я этого не сделал. Возможно, я буду в будущем, но этот метод работает (хотя он выглядит проще, чем IntentService).