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

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

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

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

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

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

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

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

34
YAUHEN
146 / 128 / 6
Регистрация: 29.07.2008
Сообщений: 506
14.04.2013, 22:05 #21
Цитата Сообщение от c4sp3r Посмотреть сообщение
сервис и так в отдельном потоке работает и расчитан чтобы в нем делать долгую работу нет надобности порождать еще потоки это не рекомендуется
ну вообщето это верно не во всех случаях: интент сервис запускает свои задачи в отдельном воркер треде, а обычный сервис работает в главном ui треде и если попытаться выполнить долгосрочную задачу (sleep например) то с лёгкостью словите ANR

<censored>, пока ответил уже опоздал
0
c4sp3r
14.04.2013, 23:07
  #22

Не по теме:

YAUHEN, :) да забыл добавить что это касается IntentService

0
xbarmaglot
3 / 3 / 1
Регистрация: 06.10.2012
Сообщений: 248
15.04.2013, 14:39  [ТС] #23
Попробовал использовать AlarmManager
Java
1
2
3
4
5
6
7
8
        AlarmManager amanager = (AlarmManager)getSystemService(ALARM_SERVICE);
        if (amanager != null)
        {
            PendingIntent intent1 = createIntent(AlarmReceiver.ALARM_ACTION, AlarmReceiver.EXTRA_ALARM_1);
            PendingIntent intent2 = createIntent(AlarmReceiver.ALARM_ACTION, AlarmReceiver.EXTRA_ALARM_2);
            amanager.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), 3 * 60 * 1000, intent1);
            amanager.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), 5 * 60 * 1000, intent2);         
        }
То есть должны приходить 2 сообщения. Первое каждые 3 минуты, а второе кажые 5 минут.
Но приходит только первое и каждые 5 минут.

Так нельзя делать ?
Или один intent на один BroadcastReceiver ?
0
c4sp3r
0x5B4C322291BD52AE
93 / 93 / 5
Регистрация: 04.03.2013
Сообщений: 295
15.04.2013, 16:25 #24
xbarmaglot, почитай например это и станет понятнее:
http://startandroid.ru/ru/uroki/vse-...rmmanager.html
0
xbarmaglot
3 / 3 / 1
Регистрация: 06.10.2012
Сообщений: 248
15.04.2013, 21:01  [ТС] #25
В общем разобрался с AlarmManager.

Сделал используя AlarmManager и AsyncTask. Единственное, если закрывается мой процесс, то нужно ли прибивать AsyncTask
или система сама его прибъет. Просто если это поток, то можно вызывать Thread.interrupt и будут завершены все wait-функции.
Циклы же можно проверять на isInterrupted.

А как прервать выполнение AsyncTask, если там есть wait-функции?
0
c4sp3r
0x5B4C322291BD52AE
93 / 93 / 5
Регистрация: 04.03.2013
Сообщений: 295
15.04.2013, 23:43 #26
xbarmaglot,
http://developer.android.com/reference/android/os/AsyncTask.html
http://developer.android.com/referen...ancelled%28%29
http://developer.android.com/referen...l%28boolean%29
0
V0v1k
1160 / 984 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
16.04.2013, 00:06 #27
Цитата Сообщение от xbarmaglot Посмотреть сообщение
А как прервать выполнение AsyncTask, если там есть wait-функции?
notifyAll()
0
xbarmaglot
3 / 3 / 1
Регистрация: 06.10.2012
Сообщений: 248
20.04.2013, 23:16  [ТС] #28
V0v1k, а где в документации сказано, что notifyAll прерывает wait-функции ?

Добавлено через 2 минуты
На сколько я знаю notify прерывет Object.wait.
А как быть с await, tryLock, ...
0
V0v1k
1160 / 984 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
20.04.2013, 23:21 #29
Цитата Сообщение от xbarmaglot Посмотреть сообщение
На сколько я знаю notify прерывет Object.wait.
а бывает другой wait?
0
xbarmaglot
3 / 3 / 1
Регистрация: 06.10.2012
Сообщений: 248
20.04.2013, 23:22  [ТС] #30
Цитата Сообщение от V0v1k Посмотреть сообщение
а бывает другой wait?
await, tryLock, ...
0
V0v1k
1160 / 984 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
20.04.2013, 23:22 #31
Цитата Сообщение от xbarmaglot Посмотреть сообщение
А как быть с await, tryLock, ...
для них, вероятно, есть свои методы, unlock() например.
0
xbarmaglot
3 / 3 / 1
Регистрация: 06.10.2012
Сообщений: 248
20.04.2013, 23:22  [ТС] #32
join
0
V0v1k
1160 / 984 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
20.04.2013, 23:23 #33
а чем вас обычный wait не устраивает, лично я не встречал await и tryLock на практике.
0
xbarmaglot
3 / 3 / 1
Регистрация: 06.10.2012
Сообщений: 248
20.04.2013, 23:26  [ТС] #34
На счет прерывания
Java
1
Threads blocked in one of Object's wait() methods or one of Thread's join() or sleep() methods will be woken up, their interrupt status will be cleared, and they receive an InterruptedException.
то есть interrupt прерывает многие wait.
Да и tryLock тоже с ним дружит
Java
1
Acquires the lock if it is free within the given waiting time and the current thread has not been interrupted.
Получается, что поток можно завершить на любом ожидании, а асинхронную задачу нет.
0
xbarmaglot
3 / 3 / 1
Регистрация: 06.10.2012
Сообщений: 248
24.04.2013, 11:42  [ТС] #35
Так как завершить AsyncTask ?
0
24.04.2013, 11:42
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.04.2013, 11:42
Привет! Вот еще темы с решениями:

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

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

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

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


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

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

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