Форум программистов, компьютерный форум CyberForum.ru

Остановка зацикленого потока - Android

Войти
Регистрация
Восстановить пароль
 
ASDFD12
31 / 31 / 5
Регистрация: 15.09.2012
Сообщений: 408
17.12.2013, 00:04     Остановка зацикленого потока #1
Есть активити. Из него запускается сервис. В методе onStartCommand сервиса, запускается поток, в котором присутствует бесконечный цикл. При остановке сервиса из активити, поток продолжает работать. Как его остановить из активити.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
korsaj
148 / 117 / 9
Регистрация: 16.08.2013
Сообщений: 507
17.12.2013, 00:23     Остановка зацикленого потока #2
В сервисе организовать метод завершения потока. А в главном активите вызывать его при завершении.
angryrobot
Командир зеленых роботов
 Аватар для angryrobot
346 / 283 / 53
Регистрация: 08.10.2013
Сообщений: 564
17.12.2013, 00:28     Остановка зацикленого потока #3
Для начала немного перепиши свой бесконечный цикл в отельном потоке:

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
            Thread myThread = new Thread(new Runnable() {
                @Override
                public void run() {
                    //Пока поток не прервали - крутим цикл
                    while (!Thread.currentThread().isInterrupted()) { 
                        System.out.println("Привет из потока " + Thread.currentThread().getName());
                        
                        try {
                            Thread.sleep(10000);
                        } catch (InterruptedException e) {
                            //Если поток прервали пока мы спали - возникнет исключение.
                            //Сразу выходим из метода run
                            return;
                        }
                    }
                }
            });
            myThread.start();
Затем переопредели метод который вызывается при остановке сервиса и впиши туда

Java
1
myThread.interrupt();
ASDFD12
31 / 31 / 5
Регистрация: 15.09.2012
Сообщений: 408
17.12.2013, 00:29  [ТС]     Остановка зацикленого потока #4
Цитата Сообщение от korsaj Посмотреть сообщение
В сервисе организовать метод завершения потока. А в главном активите вызывать его при завершении.
Как это сделать? Дайте пример кода. Хотя бы примерно. Я так понял этот код можна поместить в метод onDestroy() сервиса. Вот так?
Java
1
2
3
4
5
 public void onDestroy() {
      thread.stop(); // где thread зацикленный поток
        super.onDestroy();
      
      }
angryrobot
Командир зеленых роботов
 Аватар для angryrobot
346 / 283 / 53
Регистрация: 08.10.2013
Сообщений: 564
17.12.2013, 00:34     Остановка зацикленого потока #5
Цитата Сообщение от ASDFD12 Посмотреть сообщение
Как это сделать? Дайте пример кода. Хотя бы примерно. Я так понял этот код можна поместить в метод onDestroy() сервиса. Вот так?
Java
1
2
3
4
5
 public void onDestroy() {
      thread.stop(); // где thread зацикленный поток
        super.onDestroy();
      
      }
Метод стоп вызывать не надо, это очень плохая привычка хотя и работать будет. Поток должен умирать по своей воле, после того как сам закроет все файлы/сетевые соединения которые он открыл. Даже если у тебя там ничего такого нет - всё равно лучше не надо. Хотя бы из-за того что эклипс перечеркивает тебе метод stop ))))
ASDFD12
31 / 31 / 5
Регистрация: 15.09.2012
Сообщений: 408
17.12.2013, 00:37  [ТС]     Остановка зацикленого потока #6
Цитата Сообщение от angryrobot Посмотреть сообщение
Для начала немного перепиши свой бесконечный цикл в отельном потоке:

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
            Thread myThread = new Thread(new Runnable() {
                @Override
                public void run() {
                    //Пока поток не прервали - крутим цикл
                    while (!Thread.currentThread().isInterrupted()) { 
                        System.out.println("Привет из потока " + Thread.currentThread().getName());
                        
                        try {
                            Thread.sleep(10000);
                        } catch (InterruptedException e) {
                            //Если поток прервали пока мы спали - возникнет исключение.
                            //Сразу выходим из метода run
                            return;
                        }
                    }
                }
            });
            myThread.start();
Затем переопредели метод который вызывается при остановке сервиса и впиши туда

Java
1
myThread.interrupt();
Спасибо как раз то что надо.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.12.2013, 09:23     Остановка зацикленого потока
Еще ссылки по теме:

Android Остановка / воспроизведение аудио
Android Остановка анимации
Подмена потока с микрофона Android
Android Не работает остановка потока!
Остановка потока Android

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
korsaj
148 / 117 / 9
Регистрация: 16.08.2013
Сообщений: 507
17.12.2013, 09:23     Остановка зацикленого потока #7
Цитата Сообщение от ASDFD12 Посмотреть сообщение
Как это сделать? Дайте пример кода. Хотя бы примерно. Я так понял этот код можна поместить в метод onDestroy() сервиса. Вот так?
Откройте пример из эклипса BluetoothChat, в нем сделано примерно так как описал ASDFD12
В нем только сокет закрывается.
Yandex
Объявления
17.12.2013, 09:23     Остановка зацикленого потока
Ответ Создать тему
Опции темы

Текущее время: 05:24. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru