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

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

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 33, средняя оценка - 4.79
xbarmaglot
3 / 3 / 0
Регистрация: 06.10.2012
Сообщений: 242
13.04.2013, 23:10     Завершение потока #1
Необходимо корректно завершить поток.
Сейчас код такой
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 и если было прерывание, то поток завершится.
Но складывается впечатление, что поток вылетает. Не могу поймать где.

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

<censored>, пока ответил уже опоздал
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
c4sp3r
14.04.2013, 23:07
  #22

Не по теме:

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

xbarmaglot
3 / 3 / 0
Регистрация: 06.10.2012
Сообщений: 242
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 ?
c4sp3r
0x5B4C322291BD52AE
 Аватар для c4sp3r
91 / 91 / 5
Регистрация: 04.03.2013
Сообщений: 295
15.04.2013, 16:25     Завершение потока #24
xbarmaglot, почитай например это и станет понятнее:
http://startandroid.ru/ru/uroki/vse-...rmmanager.html
xbarmaglot
3 / 3 / 0
Регистрация: 06.10.2012
Сообщений: 242
15.04.2013, 21:01  [ТС]     Завершение потока #25
В общем разобрался с AlarmManager.

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

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

Добавлено через 2 минуты
На сколько я знаю notify прерывет Object.wait.
А как быть с await, tryLock, ...
V0v1k
1157 / 981 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
20.04.2013, 23:21     Завершение потока #29
Цитата Сообщение от xbarmaglot Посмотреть сообщение
На сколько я знаю notify прерывет Object.wait.
а бывает другой wait?
xbarmaglot
3 / 3 / 0
Регистрация: 06.10.2012
Сообщений: 242
20.04.2013, 23:22  [ТС]     Завершение потока #30
Цитата Сообщение от V0v1k Посмотреть сообщение
а бывает другой wait?
await, tryLock, ...
V0v1k
1157 / 981 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
20.04.2013, 23:22     Завершение потока #31
Цитата Сообщение от xbarmaglot Посмотреть сообщение
А как быть с await, tryLock, ...
для них, вероятно, есть свои методы, unlock() например.
xbarmaglot
3 / 3 / 0
Регистрация: 06.10.2012
Сообщений: 242
20.04.2013, 23:22  [ТС]     Завершение потока #32
join
V0v1k
1157 / 981 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
20.04.2013, 23:23     Завершение потока #33
а чем вас обычный wait не устраивает, лично я не встречал await и tryLock на практике.
xbarmaglot
3 / 3 / 0
Регистрация: 06.10.2012
Сообщений: 242
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.
Получается, что поток можно завершить на любом ожидании, а асинхронную задачу нет.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.04.2013, 11:42     Завершение потока
Еще ссылки по теме:

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

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

Или воспользуйтесь поиском по форуму:
xbarmaglot
3 / 3 / 0
Регистрация: 06.10.2012
Сообщений: 242
24.04.2013, 11:42  [ТС]     Завершение потока #35
Так как завершить AsyncTask ?
Yandex
Объявления
24.04.2013, 11:42     Завершение потока
Ответ Создать тему
Опции темы

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