Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

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

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

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

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

Завершение потока AsyncTask - Программирование Android
Доброго времени суток. Возникла проблема с закрытием потока. Первый раз код выполняется и все норм, но т.к. при нажатии на кнопку...

Завершение сервиса - Программирование Android
вот метод завершающий сервис в основной активности: public void onClickStop(View v) { stopService(new Intent(this,...

Завершение работы приложения - Программирование Android
у меня есть менюшка. там есть кнопочка quit, мне нужна чтоб она полностью прекращала работу приложения. Я пытаюсь сделать подобным образом:...

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

Принудительное завершение звонка - Программирование
Здравствуйте. Подскажите пожалуйста как завершить звонок не дожидаясь, когда на него ответят. Звоню так: Intent intent = new...

Программное завершение приложения - Программирование Android
Здравствуйте. Как программно завершить приложение? То есть не завершить активность через finish(), а именно выйти из приложения вообще.

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

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

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

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

Вот и вопрос - правильно ли я останавливаю поток. Или в моем коде есть ошибка, которая может
привести к остановке потока.
0
YuraAAA
1577 / 1318 / 271
Регистрация: 25.10.2009
Сообщений: 3,438
Записей в блоге: 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 / 0
Регистрация: 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
1577 / 1318 / 271
Регистрация: 25.10.2009
Сообщений: 3,438
Записей в блоге: 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
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.
0
YuraAAA
1577 / 1318 / 271
Регистрация: 25.10.2009
Сообщений: 3,438
Записей в блоге: 2
14.04.2013, 19:51 #15
c4sp3r, а, ну да, затупил. Конечно проще такой сервис использовать, чем возиться с асинхронностью)
0
14.04.2013, 19:51
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.04.2013, 19:51
Привет! Вот еще темы с ответами:

Завершение предыдущего активити (удаление из стека) - Программирование Android
товарищи, подскажите способы завершения предыдущего активити в стеке, чтобы по нажатию клавиши &quot;назад&quot; из последующего я уже не возобновлял...

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

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

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


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

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

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