У меня есть этот сервис:Android темы и услуги
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
running = true;
new Thread(){
@Override
public void run() {
super.run();
while (running) { Thread.sleep(60); ... }
}
}.start();
return super.onStartCommand(intent, flags, startId);
}
Я видел этот пример на курсе Android Bootcamp на YouTube и он работал. Мой вопрос: это не опасная вещь? потому что, если служба будет остановлена во время спящего потока, ее память может быть вытеснена GC, а затем поток попытается получить доступ к нераспределенной переменной (работает) ... Я подозреваю, что она работает, потому что она добавляет +1 к счетчику ссылок на работу и почему он будет вытеснен только тогда, когда поток закончится, но я бы хотел, чтобы кто-то подтвердил это и, возможно, дал подробное объяснение этому процессу.
Спасибо !.
Это правильный ответ. Даже если set running = false в onDestroy(), у нас все еще есть потенциальная утечка памяти, если мы не гарантируем завершение потока до выхода onDestroy(). Вот почему мы не используем голый Thread и вместо этого используем конструкции более высокого уровня. –
Спасибо за ответ! каковы эти конструкции более высокого уровня? и как бы вы это сделали без риска утечки памяти? (Я хочу, чтобы служба запускалась и выполняла что-то каждые 60 секунд, пока служба не остановилась). Прочее, определяющее поток в классе обслуживания и остановку его на onDestroy службы. – TomerZ
Вы можете использовать ExecutorService, возвращенный из Executors.newSingleThreadExecutor() для этого. Затем вы можете использовать shutdown() и waitTermination(), чтобы убедиться, что он отключился должным образом. –