Форум программистов, компьютерный форум, киберфорум
Наши страницы
Программирование Android
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 33, средняя оценка - 4.79
xbarmaglot
3 / 3 / 1
Регистрация: 06.10.2012
Сообщений: 248
#1

Завершение потока - Программирование Android

13.04.2013, 23:10. Просмотров 4732. Ответов 34
Метки нет (Все метки)

Необходимо корректно завершить поток.
Сейчас код такой
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
class MyThread extends Thread
{
    private void method() throws InterruptedException
    {
        ...
    }
 
    public void run()
    {
        while(!isInterrupted())
        {
             try
             {
                 method();
                 super.sleep(...);
             }
             catch (Exception ex)
             {
                 ...
             }
        }
    }
}
То есть при любом исключении в потоке оно будет поймано.
Далее будет проверка на isInterrupted и если было прерывание, то поток завершится.
Но складывается впечатление, что поток вылетает. Не могу поймать где.

Правильно ли завершение потока ?
http://www.cyberforum.ru/android-dev/thread696055.html
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.04.2013, 23:10
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Завершение потока (Программирование Android):

Завершение сервиса
вот метод завершающий сервис в основной активности: public void...

Принудительное завершение звонка
Здравствуйте. Подскажите пожалуйста как завершить звонок не дожидаясь, когда...

Завершение работы приложения
у меня есть менюшка. там есть кнопочка quit, мне нужна чтоб она полностью...

Программное завершение приложения
Здравствуйте. Как программно завершить приложение? То есть не завершить...

Коректное завершение программы
Есть главное activity, которое запускает сервис. Сервис выполняет длительную...

34
c4sp3r
0x5B4C322291BD52AE
93 / 93 / 5
Регистрация: 04.03.2013
Сообщений: 295
13.04.2013, 23:18 #2
xbarmaglot, у меня другой вопрос ты это делаешь в сервисе если да то зачем?
0
xbarmaglot
3 / 3 / 1
Регистрация: 06.10.2012
Сообщений: 248
13.04.2013, 23:21  [ТС] #3
Цитата Сообщение от c4sp3r Посмотреть сообщение
xbarmaglot, у меня другой вопрос ты это делаешь в сервисе если да то зачем?
да, в сервисе. Не хотел предыдущую тему захламлять.
А делаю, т.к. нужны регулярные действия, которые долгие.
Чтоб не вещать главный поток, то запускаю отдельный
0
metrolog
4 / 4 / 1
Регистрация: 18.11.2012
Сообщений: 101
13.04.2013, 23:22 #4
в чем проблема завершить его с помощью флага в любой нужный для тебя момент?
0
xbarmaglot
3 / 3 / 1
Регистрация: 06.10.2012
Сообщений: 248
13.04.2013, 23:26  [ТС] #5
Цитата Сообщение от metrolog Посмотреть сообщение
в чем проблема завершить его с помощью флага в любой нужный для тебя момент?
раньше так и делал, но где-то меня переубедили, что interrupt единственное правильное решение.
А для флага нужно еще и заводить свой метод остановки.

Добавлено через 1 минуту
И флаг не прервет sleep и все wait-функции
0
c4sp3r
0x5B4C322291BD52AE
93 / 93 / 5
Регистрация: 04.03.2013
Сообщений: 295
13.04.2013, 23:26 #6
xbarmaglot, сервис и так в отдельном потоке работает и расчитан чтобы в нем делать долгую работу нет надобности порождать еще потоки это не рекомендуется. После того как он выполнил работу он завершается если тебе переодически нужно его запускать используют AlarmManager.
0
metrolog
4 / 4 / 1
Регистрация: 18.11.2012
Сообщений: 101
13.04.2013, 23:26 #7
все время пользуюсь флагом, метод же не проблема сделать, да и вы можете в любой момент сами остановить поток.
0
xbarmaglot
3 / 3 / 1
Регистрация: 06.10.2012
Сообщений: 248
13.04.2013, 23:29  [ТС] #8
Цитата Сообщение от c4sp3r Посмотреть сообщение
xbarmaglot, сервис и так в отдельном потоке работает и расчитан чтобы в нем делать долгую работу нет надобности порождать еще потоки это не рекомендуется. После того как он выполнил работу он завершается если тебе переодически нужно его запускать используют AlarmManager.
А вот не хотелось бы чтоб он вообще останавливался

Добавлено через 28 секунд
Цитата Сообщение от metrolog Посмотреть сообщение
все время пользуюсь флагом, метод же не проблема сделать, да и вы можете в любой момент сами остановить поток.
ну а как с sleep и wait-функциями ?
0
c4sp3r
0x5B4C322291BD52AE
93 / 93 / 5
Регистрация: 04.03.2013
Сообщений: 295
13.04.2013, 23:32 #9
Цитата Сообщение от xbarmaglot Посмотреть сообщение
А вот не хотелось бы чтоб он вообще останавливался
Он останавливается только в крайнем случае и с помощью того же AlarmManager можно его снова запустить (в случае критической оставки).
0
xbarmaglot
3 / 3 / 1
Регистрация: 06.10.2012
Сообщений: 248
13.04.2013, 23:41  [ТС] #10
Тогда объясню подробнее.
Служба обрабатывает входящие события. При этом сохраняет данные.
Запускаются при этом 2 потока.
Один архивирует данные. Он запускается раз в час. Это может занять несколько секунд.
Второй, запускается раз в 10 минут. Он отправляет архивированные данные на почту - это может занять несколько минут.

При этом блокировать основной поток сервиса нельзя, т.к. может прийти событие на обработку.
Вот я и запускаю потоки.
Но складывается впечатление, что потоки вылетают. Причем в отладке не видно этого.
А причина - нет регулярной работы потоков. Видно по отосланным данным и времени создания архивов.

Вот и вопрос - правильно ли я останавливаю поток. Или в моем коде есть ошибка, которая может
привести к остановке потока.
0
YuraAAA
1578 / 1319 / 282
Регистрация: 25.10.2009
Сообщений: 3,436
Записей в блоге: 2
14.04.2013, 16:42 #11
Цитата Сообщение от c4sp3r Посмотреть сообщение
xbarmaglot, сервис и так в отдельном потоке работает и расчитан чтобы в нем делать долгую работу нет надобности порождать еще потоки это не рекомендуется. После того как он выполнил работу он завершается если тебе переодически нужно его запускать используют AlarmManager.
оО
С каких это пор???

Caution: A service runs in the main thread of its hosting process—the service does not create its own thread and does not run in a separate process (unless you specify otherwise).


xbarmaglot, почему бы не использовать AsynkTask для этого?
0
xbarmaglot
3 / 3 / 1
Регистрация: 06.10.2012
Сообщений: 248
14.04.2013, 17:21  [ТС] #12
Цитата Сообщение от YuraAAA Посмотреть сообщение
оО
С каких это пор???

Caution: A service runs in the main thread of its hosting process—the service does not create its own thread and does not run in a separate process (unless you specify otherwise).


xbarmaglot, почему бы не использовать AsynkTask для этого?
А в чем разница ? Да я так и не понял как AsynkTask периодически запускать...
0
YuraAAA
1578 / 1319 / 282
Регистрация: 25.10.2009
Сообщений: 3,436
Записей в блоге: 2
14.04.2013, 19:28 #13
Для этого можно использовать TimerTask.

Смотрите. Каркас асинхронной задачи:

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public class PerformBackgroundTask extends AsyncTask<Integer, Void, Void>{
 
    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        //Вызывается перед началом исполнения
    }
    
    @Override
    protected Void doInBackground(Integer... params) {
        //Сам поток "исполнения"
        //TODO:
        return null;
    }
    
    @Override
    protected void onPostExecute(Void result) {
        super.onPostExecute(result);
        //Вызывается после исполнения
    }
    
}
Вызов:

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public void callAsynchronousTast(){
        final Handler handler = new Handler();
        Timer timer = new Timer();
        TimerTask doAsynchronousTask = new TimerTask() {       
            @Override
            public void run() {
                handler.post(new Runnable() {
                    public void run() {       
                        try {
                            PerformBackgroundTask performBackgroundTask = new PerformBackgroundTask();
                            performBackgroundTask.execute();
                        } catch (Exception e) {
                            // TODO Auto-generated catch block
                        }
                    }
                });
            }
        };
        timer.schedule(doAsynchronousTask, 0, 50000); //Выполнение каждые 50 секунд (50000 милисекунд)
        
    }
0
c4sp3r
0x5B4C322291BD52AE
93 / 93 / 5
Регистрация: 04.03.2013
Сообщений: 295
14.04.2013, 19:35 #14
Цитата Сообщение от YuraAAA Посмотреть сообщение
оО
С каких это пор???
Caution: A service runs in the main thread of its hosting process—the service does not create its own thread and does not run in a separate process (unless you specify otherwise).
Ты прав! Я просто в основном использую IntentService и предположил что ТС тоже его использует это конечно моя ошибка нужно было уточнить этот момент.

The IntentService does the following:
Creates a default worker thread that executes all intents delivered to onStartCommand() separate from your application's main thread.
0
YuraAAA
1578 / 1319 / 282
Регистрация: 25.10.2009
Сообщений: 3,436
Записей в блоге: 2
14.04.2013, 19:51 #15
c4sp3r, а, ну да, затупил. Конечно проще такой сервис использовать, чем возиться с асинхронностью)
0
xbarmaglot
3 / 3 / 1
Регистрация: 06.10.2012
Сообщений: 248
14.04.2013, 20:34  [ТС] #16
YuraAAA, а зачем Handler. Разве нельзя просто запустить TimerTask?

Добавлено через 38 минут
Все, понял как сделать.
Остался только один вопрос - если я запускаю задачу каждую минуту,
а задача выполняется дольше чем минута, то будет создана вторая задача, которая будет
делить ресурсы с первой.

А хотелось бы, чтобы вторая задача не запускалась, если первая уже запущена и не отработала.
0
YuraAAA
1578 / 1319 / 282
Регистрация: 25.10.2009
Сообщений: 3,436
Записей в блоге: 2
14.04.2013, 20:56 #17
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public void callAsynchronousTast(long delay){
        final Handler handler = new Handler();
        Timer timer = new Timer();
        TimerTask doAsynchronousTask = new TimerTask() {       
            @Override
            public void run() {
                handler.post(new Runnable() {
                    public void run() {       
                        try {
                            PerformBackgroundTask performBackgroundTask = new PerformBackgroundTask();
                            performBackgroundTask.execute();
                        } catch (Exception e) {
                           
                        }
                    }
                });
            }
        };
        timer.schedule(doAsynchronousTask, delay);
        
    }
И вызываем этот метод из асинхронной задачи.

Java
1
2
3
4
5
@Override
    protected void onPostExecute(Void result) {
        super.onPostExecute(result);
        //TODO: callAsynchronousTast(0) - run immediately
    }
0
xbarmaglot
3 / 3 / 1
Регистрация: 06.10.2012
Сообщений: 248
14.04.2013, 21:00  [ТС] #18
Цитата Сообщение от YuraAAA Посмотреть сообщение
И вызываем этот метод из асинхронной задачи.
Не понял зачем ?

P.S. Да и так проще
Java
1
2
3
4
5
6
7
8
9
        m_timer.schedule(new TimerTask()
        {
            @Override
            public void run()
            {
                WorkAsyncTask task = new WorkAsyncTask(...);
                task.execute();
            }
        }, 0, 10 * 60 * 1000);
Или handler.post имеет какой-то смысл ?
0
YuraAAA
1578 / 1319 / 282
Регистрация: 25.10.2009
Сообщений: 3,436
Записей в блоге: 2
14.04.2013, 21:51 #19
Если Вы не работаете с UI из этого потока, то можно выкинуть handler.

Вызывать асинхронную задачу регулярно, через определённый промежуток времени - не есть гуд. Ведь как я понял, задача должна точно окончиться, перед тем как снова запустится? По-этому, лучше вызывайте асинхронную задачу из неё же. Но это моё личное мнение, может я и не прав
0
xbarmaglot
3 / 3 / 1
Регистрация: 06.10.2012
Сообщений: 248
14.04.2013, 21:54  [ТС] #20
Цитата Сообщение от YuraAAA Посмотреть сообщение
Если Вы не работаете с UI из этого потока, то можно выкинуть handler.
А запуск задачи можно производить не с Main потока ?

Цитата Сообщение от YuraAAA Посмотреть сообщение
Вызывать асинхронную задачу регулярно, через определённый промежуток времени - не есть гуд. Ведь как я понял, задача должна точно окончиться, перед тем как снова запустится? По-этому, лучше вызывайте асинхронную задачу из неё же. Но это моё личное мнение, может я и не прав
Поэтому я и использовал изначально поток
0
14.04.2013, 21:54
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.04.2013, 21:54
Привет! Вот еще темы с решениями:

Поиск и завершение всех Service программы
Как убить все сервисы при выходе? У меня прога запускает в ходе работы...

Завершение предыдущего активити (удаление из стека)
товарищи, подскажите способы завершения предыдущего активити в стеке, чтобы по...

При попытке открыть второй и третий Activity происходит завершение работы программы
Подскажите где ошибка. В программирование андроида пару дней. При попытке...

Полное завершение работы приложения при нажатии навигационной кнопки "Назад"
Здравствуйте. Имеется приложение. При нажатии кнопки &quot;Домой&quot; приложение выходит...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru