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

Программирование Android

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 33, средняя оценка - 4.79
xbarmaglot
3 / 3 / 0
Регистрация: 06.10.2012
Сообщений: 243
#1

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

13.04.2013, 23:10. Просмотров 4176. Ответов 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 и если было прерывание, то поток завершится.
Но складывается впечатление, что поток вылетает. Не могу поймать где.

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

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

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

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

Вот и вопрос - правильно ли я останавливаю поток. Или в моем коде есть ошибка, которая может
привести к остановке потока.
YuraAAA
1564 / 1306 / 269
Регистрация: 25.10.2009
Сообщений: 3,424
Записей в блоге: 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 для этого?
xbarmaglot
3 / 3 / 0
Регистрация: 06.10.2012
Сообщений: 243
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 периодически запускать...
YuraAAA
1564 / 1306 / 269
Регистрация: 25.10.2009
Сообщений: 3,424
Записей в блоге: 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 милисекунд)
        
    }
c4sp3r
0x5B4C322291BD52AE
92 / 92 / 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.
YuraAAA
1564 / 1306 / 269
Регистрация: 25.10.2009
Сообщений: 3,424
Записей в блоге: 2
14.04.2013, 19:51     Завершение потока #15
c4sp3r, а, ну да, затупил. Конечно проще такой сервис использовать, чем возиться с асинхронностью)
xbarmaglot
3 / 3 / 0
Регистрация: 06.10.2012
Сообщений: 243
14.04.2013, 20:34  [ТС]     Завершение потока #16
YuraAAA, а зачем Handler. Разве нельзя просто запустить TimerTask?

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

А хотелось бы, чтобы вторая задача не запускалась, если первая уже запущена и не отработала.
YuraAAA
1564 / 1306 / 269
Регистрация: 25.10.2009
Сообщений: 3,424
Записей в блоге: 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
    }
xbarmaglot
3 / 3 / 0
Регистрация: 06.10.2012
Сообщений: 243
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 имеет какой-то смысл ?
YuraAAA
1564 / 1306 / 269
Регистрация: 25.10.2009
Сообщений: 3,424
Записей в блоге: 2
14.04.2013, 21:51     Завершение потока #19
Если Вы не работаете с UI из этого потока, то можно выкинуть handler.

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

Коректное завершение программы Android
Android Полное завершение работы приложения при нажатии навигационной кнопки "Назад"
Поиск и завершение всех Service программы Android
При попытке открыть второй и третий Activity происходит завершение работы программы Android
Остановка потока Android

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

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

Цитата Сообщение от YuraAAA Посмотреть сообщение
Вызывать асинхронную задачу регулярно, через определённый промежуток времени - не есть гуд. Ведь как я понял, задача должна точно окончиться, перед тем как снова запустится? По-этому, лучше вызывайте асинхронную задачу из неё же. Но это моё личное мнение, может я и не прав
Поэтому я и использовал изначально поток
Yandex
Объявления
14.04.2013, 21:54     Завершение потока
Ответ Создать тему
Опции темы

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