#java #android
Есть задача: запускать поток(Thread1) 1 раз и только. При этом, другой поток(Thread2) периодически создает нужный поток(Thread1). Из за невозможности контролировать количество, происходит повторение действий. Как решить красиво и правильно я не знаю. Главный вопрос. Имеем static Thread myThread; @Override public void run() { if (myThread != null) { if (isAlive()) { // Если поток есть, и живой, то return. // Т.е. получается поток создался, // но не делая ничего завершился, // а предыдущий, который еще работает.... дорабатывает. return; } } // Если не было return, то поток работает } Но, я переживаю что произойдет следующее: в потоке код выполняется в while(true) {}, т.е. постоянно. На android. И если из за нехватки памяти или другим причинам ОС она прибьет мой поток(Thread1), то другой поток(Thread2) создает его заново. Происходит код выше, и если static Thread myThread не обнулится, то получится что и не работает нужный поток и другие не смогут начать работу. Метода onDestroy нет не у Thread, не у Runnable интерфейса. Возможно я предложил очень "некрасивое" решение и делается это совсем не так, если кто знает, подскажите в каком направлении смотреть. Я не совсем понимаю природу работы сборщика мусора в java, и политики работы ОС Android(причины завершить процесс аварийно и т.д.). P.S. Вопрос вкратце: должен жить 1 поток либо ни одного. Если ни одного нет, иметь возможность запустить 1. UDP: Такой код вроде работает, не знаю как будет вести себя в нестандартных ситуациях. public static Thread myThread; @Override public int onStartCommand(Intent intent, int flags, int startId) { if (myThread == null) { myThread = new Thread(new TaskExecutor(this)); myThread.start(); } else { if (!myThread.isAlive()) { myThread = new Thread(new TaskExecutor(this)); myThread.start(); } } return START_STICKY; } Первый вариант что я писал, там почему то не срабатывает this.isAlive() внутри потока уже. Возвращает false; UPD 2: Eugene Krivenja ответ хороший. Но Создавая поток при пересоздании сервиса получается так: Старый сервис создан, создал поток. Потом Сервис умирает (я его сам прибил), но поток функционирует. Сервис пере создается, создает поток - имеем 2 рабочих потока, которые дублируют действия. Статик переменная решила мою проблему, но как ты сказал могут быть необъяснимые действия. Буду думать дальше, как сделать 100% безопасно.
Ответы
Ответ 1
Хранить что-либо в статических переменных на Андроид очень не рекомендуется. Могут происходить труднообьяснимые вещи. Все из-за механизма выгрузки-загрузки классов. Стандартный подход в вашем случае, создать потомка от класса Application и в нем хранить ссылку (не статическую) на поток, а сам поток создавать в onCreate(). В этом случае поток система уничтожит вместе с обьектом Application, а при перезапуске приложения Application создается самым первым, соответсвенно и поток будет создан. Второй вариант с сервисом рабочий, и наверное предпочтительный, только myThread опять же не должен быть статическим и поток уничтожится только вместе с сервисом. Поэтому не стоить перезапускать поток кем-то извне, надо перезапускать сам сервис. Как-то так. На Андроид кроме констант в статических переменных лучше ничего вообще не иметь.
Комментариев нет:
Отправить комментарий