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

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

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

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

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

Правильно ли завершение потока ?
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(), а именно выйти из приложения вообще.

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
xbarmaglot
3 / 3 / 0
Регистрация: 06.10.2012
Сообщений: 248
14.04.2013, 20:34  [ТС] #16
YuraAAA, а зачем Handler. Разве нельзя просто запустить TimerTask?

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

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

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

Цитата Сообщение от YuraAAA Посмотреть сообщение
Вызывать асинхронную задачу регулярно, через определённый промежуток времени - не есть гуд. Ведь как я понял, задача должна точно окончиться, перед тем как снова запустится? По-этому, лучше вызывайте асинхронную задачу из неё же. Но это моё личное мнение, может я и не прав
Поэтому я и использовал изначально поток
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
Сообщений: 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 ?
c4sp3r
0x5B4C322291BD52AE
92 / 92 / 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
Сообщений: 248
15.04.2013, 21:01  [ТС] #25
В общем разобрался с AlarmManager.

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

А как прервать выполнение AsyncTask, если там есть wait-функции?
c4sp3r
0x5B4C322291BD52AE
92 / 92 / 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
1158 / 982 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
16.04.2013, 00:06 #27
Цитата Сообщение от xbarmaglot Посмотреть сообщение
А как прервать выполнение AsyncTask, если там есть wait-функции?
notifyAll()
xbarmaglot
3 / 3 / 0
Регистрация: 06.10.2012
Сообщений: 248
20.04.2013, 23:16  [ТС] #28
V0v1k, а где в документации сказано, что notifyAll прерывает wait-функции ?

Добавлено через 2 минуты
На сколько я знаю notify прерывет Object.wait.
А как быть с await, tryLock, ...
V0v1k
1158 / 982 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
20.04.2013, 23:21 #29
Цитата Сообщение от xbarmaglot Посмотреть сообщение
На сколько я знаю notify прерывет Object.wait.
а бывает другой wait?
xbarmaglot
3 / 3 / 0
Регистрация: 06.10.2012
Сообщений: 248
20.04.2013, 23:22  [ТС] #30
Цитата Сообщение от V0v1k Посмотреть сообщение
а бывает другой wait?
await, tryLock, ...
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.04.2013, 23:22
Привет! Вот еще темы с ответами:

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
20.04.2013, 23:22
Ответ Создать тему
Опции темы

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