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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.60
dubok79
323 / 121 / 11
Регистрация: 01.11.2012
Сообщений: 586
#1

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

03.12.2012, 21:12. Просмотров 1231. Ответов 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
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Не выполняется задание таймера (Программирование Android):

Задание времени моделирования без отдельного сегмента-таймера - GPSS
Возможно ли как-нибудь запустить программу без таймера и чтобы время было 480? Вот код: generate 20,5 queue g seize gc ...

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

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

Задание из Планировщика Windows запускается, но не выполняется - Администрирование Windows
Добрый день. Есть задание - копирование файлов по условию между папками на сетевом диске net use Q: \\....\SIGN1 /u:REGIONS\Учетка...

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

Код не выполняется в одном месте, но выполняется в другом - C++
Вот код процедуры: LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { PAINTSTRUCT ps; HDC hdc; ...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
V0v1k
1158 / 982 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
03.12.2012, 21:28 #2
без кода не разобраться.
таймер демон?
зачем вам сервис?
0
dubok79
323 / 121 / 11
Регистрация: 01.11.2012
Сообщений: 586
03.12.2012, 21:53  [ТС] #3
Не знаю, что из кода даже выкладывать. хотя бы сам принцип на словах, как действовать. Есть виджет. Когда до времени окончания остается меньше часа предполагается включить таймер, чтобы на виджете отсчитывались минуты, когда минуты кончаться должно выйти уведомление о завершении времени.
Сервис создаю потому, что таймер отказался работать в активти виджета для его обновления, а так работает, но только в жмуляторе на телефоне похоже эту задачу убивает кто то. Читал, что таймерные задачи это мусор.
0
V0v1k
1158 / 982 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
03.12.2012, 22:42 #4
Цитата Сообщение от dubok79 Посмотреть сообщение
Не знаю, что из кода даже выкладывать.
создание таймера, запуск тасков.
0
dubok79
323 / 121 / 11
Регистрация: 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
1158 / 982 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
04.12.2012, 23:42 #6
разберитесь почему без сервиса не работает.
0
dubok79
323 / 121 / 11
Регистрация: 01.11.2012
Сообщений: 586
05.12.2012, 00:00  [ТС] #7
Цитата Сообщение от V0v1k Посмотреть сообщение
разберитесь почему без сервиса не работает.
А как? На эмуляторе работает, на телефоне нет. Просто ничего не происходит. Пытался дебажить, оно даже не заходит в класс с сервисом.
0
V0v1k
1158 / 982 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
05.12.2012, 01:21 #8
Цитата Сообщение от dubok79 Посмотреть сообщение
без сервиса
.....
0
kvaka
29 / 29 / 3
Регистрация: 26.06.2012
Сообщений: 163
05.12.2012, 10:18 #9
обратите внимание на AlarmManager. Думаю, он вам подходит.
1
lifestyle
Mobile Developer
232 / 228 / 4
Регистрация: 10.05.2009
Сообщений: 917
07.12.2012, 01:07 #10
Я думаю все очень просто. Сервис это процесс , Thread это поток, поток привязан к процессу, когда процесс убивается поток прерывается вот и все.
Можно проще сделать - создать сервис с Handler'ом и отсылать Message с задержкой, главное сервису приоретет дать высокий, что не закрылся если что ...

Добавлено через 1 минуту
Цитата Сообщение от kvaka Посмотреть сообщение
обратите внимание на AlarmManager. Думаю, он вам подходит.
тоже вариант... но в Deep Sleep Mode он не сработает...
0
dubok79
323 / 121 / 11
Регистрация: 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
232 / 228 / 4
Регистрация: 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
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.12.2012, 21:59
Привет! Вот еще темы с ответами:

SQLite не выполняется запрос в коде, но выполняется в phpliteadmin - PHP БД
всем привет! необходима небольшая помощь, есть бд с таблицей "keys" и одной из колонок в ней - "key". также есть запрос: SELECT * FROM...

Нужно передать файл, расположенный на рабочей станции, на которой выполняется сервер, на рабочую станцию​​, на которой выполняется клиент. MailSlot - C++
Ребята. Нужна помощь. Нужно передать файл, расположенный на рабочей станции, на которой выполняется сервер, на рабочую станцию​​, на...

Задание исходного значения параметра эксперимента (задание интенсивности прибытия заявок) - AnyLogic
Доброго времени! Вопрос в следующем: можно ли сделать так, чтобы в блоке source число генерируемых заявок задавалось не напрямую в...

Проверьте верно ли сделано задание (задание для ослабленных детей) - Механика
Схема дана на фото, нужно найти скорости точек А и В изображенных на схеме, проверьте мое решение пожалуйста !!!


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

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

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