Форум программистов, компьютерный форум, киберфорум
Наши страницы
Программирование Android
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.86/7: Рейтинг темы: голосов - 7, средняя оценка - 4.86
dubok79
324 / 122 / 10
Регистрация: 01.11.2012
Сообщений: 586
#1

Не выполняется задание таймера

03.12.2012, 21:12. Просмотров 1295. Ответов 13
Метки нет (Все метки)

Запускаю сервис, в нем в отдельном потоке запускаю класс наследованный от Runnable и убиваю сервис, а в Runnable запускаю Timer с TimerTask. Мне кажется, что я все это делаю как то не так. Ну по крайней мере минут через 10-15 таймер срабатывает как надо, а вот если его завести на час, то не работает. Подскажите как правильно пользоваться таймером, нужно ли его запускать в отдельном потоке? Спасибо.

Добавлено через 1 час 22 минуты
Почитал, что Timer не рекомендуют использовать если период его работы длительное время, т.к. он буде впустую кушать ресурсы и рекомендуют использовать ScheduledThreadPoolExecutor, но что то я не понял где связь между механизмом распределения потоков и таймером? Как вообще организовывать задачи типа будильника, что бы в определенное время выдавалось например уведомление или отправлялось сообщение или еще что-то. Подскажите, запутался...

Добавлено через 2 часа 39 минут
Блин, подскажите кто-нибудь, почему на эмуляторе TimerTask выполняется, а в телефоне нет
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.12.2012, 21:12
Ответы с готовыми решениями:

Задание времени моделирования без отдельного сегмента-таймера
Возможно ли как-нибудь запустить программу без таймера и чтобы время было 480? ...

Регламентное задание работает, но не выполняется
Добрый день. Версия конфигурации: Управление торговлей 10.3 Версия SQL...

Подскажите как выполняется задание и алгоритм
Помогите выполнить вот такое задание:

Задание из Планировщика Windows запускается, но не выполняется
Добрый день. Есть задание - копирование файлов по условию между папками на...

Задание на операторы цикла (подскажите, почему не выполняется программа)
Рассмотрим некоторое натуральное n (n > 1). Если оно четно, то разделим его на...

13
V0v1k
1160 / 984 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
03.12.2012, 21:28 #2
без кода не разобраться.
таймер демон?
зачем вам сервис?
0
dubok79
324 / 122 / 10
Регистрация: 01.11.2012
Сообщений: 586
03.12.2012, 21:53  [ТС] #3
Не знаю, что из кода даже выкладывать. хотя бы сам принцип на словах, как действовать. Есть виджет. Когда до времени окончания остается меньше часа предполагается включить таймер, чтобы на виджете отсчитывались минуты, когда минуты кончаться должно выйти уведомление о завершении времени.
Сервис создаю потому, что таймер отказался работать в активти виджета для его обновления, а так работает, но только в жмуляторе на телефоне похоже эту задачу убивает кто то. Читал, что таймерные задачи это мусор.
0
V0v1k
1160 / 984 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
03.12.2012, 22:42 #4
Цитата Сообщение от dubok79 Посмотреть сообщение
Не знаю, что из кода даже выкладывать.
создание таймера, запуск тасков.
0
dubok79
324 / 122 / 10
Регистрация: 01.11.2012
Сообщений: 586
04.12.2012, 22:49  [ТС] #5
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
 
          Calendar c = new Calendar;
          c.getInstance(TimeZone.getDefault());
          int msec = 999 - c.get(Calendar.MILLISECOND);
          //обычный класс extended Runnable  
          //в методе run которого обновление виджета
          final MyRun mr = new MyRun();
          tTask = new TimerTask() {
              @Override
              public void run() {
                  new Thread(mr).start();
              }
          };
          timer = new Timer();
          timer.scheduleAtFixedRate(tTask, msec, 60000);
Добавлено через 23 часа 59 минут
Подскажите хотя бы как запустить таймер, что ОСь его не убивала? В сервисе запускать и не убивать его пока не сделаются все задачи таймера?
0
V0v1k
1160 / 984 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
04.12.2012, 23:42 #6
разберитесь почему без сервиса не работает.
0
dubok79
324 / 122 / 10
Регистрация: 01.11.2012
Сообщений: 586
05.12.2012, 00:00  [ТС] #7
Цитата Сообщение от V0v1k Посмотреть сообщение
разберитесь почему без сервиса не работает.
А как? На эмуляторе работает, на телефоне нет. Просто ничего не происходит. Пытался дебажить, оно даже не заходит в класс с сервисом.
0
V0v1k
1160 / 984 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
05.12.2012, 01:21 #8
Цитата Сообщение от dubok79 Посмотреть сообщение
без сервиса
.....
0
kvaka
31 / 31 / 3
Регистрация: 26.06.2012
Сообщений: 166
05.12.2012, 10:18 #9
обратите внимание на AlarmManager. Думаю, он вам подходит.
1
lifestyle
Mobile Developer
234 / 230 / 18
Регистрация: 10.05.2009
Сообщений: 917
07.12.2012, 01:07 #10
Я думаю все очень просто. Сервис это процесс , Thread это поток, поток привязан к процессу, когда процесс убивается поток прерывается вот и все.
Можно проще сделать - создать сервис с Handler'ом и отсылать Message с задержкой, главное сервису приоретет дать высокий, что не закрылся если что ...

Добавлено через 1 минуту
Цитата Сообщение от kvaka Посмотреть сообщение
обратите внимание на AlarmManager. Думаю, он вам подходит.
тоже вариант... но в Deep Sleep Mode он не сработает...
0
dubok79
324 / 122 / 10
Регистрация: 01.11.2012
Сообщений: 586
07.12.2012, 09:09  [ТС] #11
Цитата Сообщение от lifestyle Посмотреть сообщение
Сервис это процесс , Thread это поток, поток привязан к процессу, когда процесс убивается поток прерывается вот и все.
Вроде бы все, так, но почему на эмуляторе после убивания процесса таймер в потоке продолжал успешно работать пока я его не убью? И еще заметил такую особенность, в уроках по сервисам, там этот сервис отслеживается на вкладке Device и когда сервис убивается, он оттуда исчезает. Так вот в эмуляторе (дроид 4.2) даже после возврата true методом stopSelfResult эта строчка не пропадала. Наверное из-за этого таймер и работал.
Еще я добавлял в манифест строчку
XML
1
android:process=":myservice"
, может и в ней дело, не совсем понял для чего она.

И, спасибо за рекомендации.
0
prtigger
0 / 0 / 0
Регистрация: 07.12.2012
Сообщений: 6
07.12.2012, 20:33 #12
Цитата Сообщение от dubok79 Посмотреть сообщение
Добавлено через 2 часа 39 минут
Блин, подскажите кто-нибудь, почему на эмуляторе TimerTask выполняется, а в телефоне нет
Могу предположить.
Сам с этим долго мучился. Но по факту, таймер не срабатывает в спящем режиме.
Ясное дело, что эмулятор в спящий режим не переходит, потому на нем все и работает, как часики.

Нужно воспользоваться AlarmManager

Добавлено через 1 минуту
Цитата Сообщение от dubok79 Посмотреть сообщение
Еще я добавлял в манифест строчку
XML
1
android:process=":myservice"
, может и в ней дело, не совсем понял для чего она.
Эта строчка означает, что сервис надо запустить в отдельном потоке, а не в общем потоке приложения. Вот и вся разница
0
lifestyle
Mobile Developer
234 / 230 / 18
Регистрация: 10.05.2009
Сообщений: 917
07.12.2012, 21:15 #13
Цитата Сообщение от prtigger Посмотреть сообщение
Эта строчка означает, что сервис надо запустить в отдельном потоке, а не в общем потоке приложения. Вот и вся разница
Не потоке а в отдельном процессе,

Цитата Сообщение от dubok79 Посмотреть сообщение
Вроде бы все, так, но почему на эмуляторе после убивания процесса таймер в потоке продолжал успешно работать пока я его не убью? И еще заметил такую особенность, в уроках по сервисам, там этот сервис отслеживается на вкладке Device и когда сервис убивается, он оттуда исчезает. Так вот в эмуляторе (дроид 4.2) даже после возврата true методом stopSelfResult эта строчка не пропадала. Наверное из-за этого таймер и работал.
Еще я добавлял в манифест строчку
Код XML
1
androidrocess=":myservice"
, может и в ней дело, не совсем понял для чего она.
И, спасибо за рекомендации.
1. Читай документацию
public final boolean stopSelfResult (int startId)

Added in API level 1
Stop the service if the most recent time it was started was startId. This is the same as calling stopService(Intent) for this particular service but allows you to safely avoid stopping if there is a start request from a client that you haven't yet seen in onStart(Intent, int).

Be careful about ordering of your calls to this function.. If you call this function with the most-recently received ID before you have called it for previously received IDs, the service will be immediately stopped anyway. If you may end up processing IDs out of order (such as by dispatching them on separate threads), then you are responsible for stopping them in the same order you received them.

Parameters
startId The most recent start identifier received in onStart(Intent, int).
Returns
Returns true if the startId matches the last start request and the service will be stopped, else false.
See Also
stopSelf()

2. Думаю использование public boolean stopService (Intent name) даст результат в эмуляторе аналогичный того что на телефоне.
0
prtigger
0 / 0 / 0
Регистрация: 07.12.2012
Сообщений: 6
07.12.2012, 21:59 #14
Цитата Сообщение от lifestyle Посмотреть сообщение
Не потоке а в отдельном процессе,
Согласен, не то слово употребил.
0
07.12.2012, 21:59
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.12.2012, 21:59

Код не выполняется в одном месте, но выполняется в другом
Вот код процедуры: LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM...

не выполняется запрос в коде, но выполняется в phpliteadmin
всем привет! необходима небольшая помощь, есть бд с таблицей "keys" и одной из...

Помогите опознать диодный мост таймера духовки Hansa BOEM 624000, диодный мост таймера
Помогите опознать диодный мост таймера духовки Hansa BOEM 624000 мост смд...


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

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

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