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

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

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

Перезапуск таймера - Программирование Android

21.03.2013, 16:29. Просмотров 1162. Ответов 11
Метки нет (Все метки)

Странное поведение таймера.
Если он отрабатывает, то в методе run() я посылаю некое событие.

Если же я хочу прервать его работу, то вызываю cancel, но не обнуляю.
Через некоторое время он посылает несколько событий.

Такое ощущение, что не останавливается, а приостанавливается, а потом заново запускается.
Почему ?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.03.2013, 16:29     Перезапуск таймера
Посмотрите здесь:

Перезапуск animatedvectordrawable - Программирование Android
Добрый день. Пытаюсь сделать так чтобы animatedVectorDrawable постоянно перезапускался автоматически. вот код самой анимации ...

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

Перезапуск службы - Программирование Android
У меня служба, которая запускается и которая не должна останавливаться. Глобальный BroadcastReceiver получает сообщения и запускает...

Обновление/перезапуск layout по нажатию - Программирование Android
необходимо, чтобы по нажатию обновлялся/перезапускался layout. как организовать?

Перезапуск сервиса после task killer - Программирование Android
Здравствуйте, подскажите пожалуйста, как сделать, что бы сервис перезапускался после того, как пользователь очищает список недавно открытых...

Перезапуск приложения после вкл/выкл разрешения на Marshmallow - Программирование Android
Добрый день! Подскажите пожалуйста, может кто сталкивался. Запускаешь приложение, заходишь максимально далеко по экранам (ну или...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
dr_yand
156 / 138 / 6
Регистрация: 13.03.2013
Сообщений: 321
Записей в блоге: 3
21.03.2013, 16:32     Перезапуск таймера #2
Приведите ваш код
xbarmaglot
3 / 3 / 0
Регистрация: 06.10.2012
Сообщений: 248
21.03.2013, 16:35  [ТС]     Перезапуск таймера #3
ну примерно так
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
        if (JsonParser.VAL_START.equals(method))
        {                                                           
            int timeout = json.getInt(JsonParser.KEY_TTL);          
            if (m_work != null)
            {
                m_timer = new Timer();
                m_timer.schedule(new WorkTimer(number)
                {
                    @Override
                    public void run()
                    {                       
                        stopWork();
                        sendResult(JsonParser.VAL_START, true);             
                    }
                }, timeout * 1000);                 
            }
            sendResult(JsonParser.VAL_START, (m_work != null));
        }
        else if (JsonParser.VAL_STOP.equals(method))
        {                                   
            m_timer.cancel();       
            stopWork();
            sendResult(JsonParser.VAL_STOP, true);  
        }
c4sp3r
0x5B4C322291BD52AE
92 / 92 / 5
Регистрация: 04.03.2013
Сообщений: 295
21.03.2013, 16:55     Перезапуск таймера #4
А ты уверен что поток таймера не активен когда ты m_timer.cancel(); вызываешь?
xbarmaglot
3 / 3 / 0
Регистрация: 06.10.2012
Сообщений: 248
21.03.2013, 17:07  [ТС]     Перезапуск таймера #5
Цитата Сообщение от c4sp3r Посмотреть сообщение
А ты уверен что поток таймера не активен когда ты m_timer.cancel(); вызываешь?
имеется ввиду, что поток не активен на момент вызова или после вызова ?
c4sp3r
0x5B4C322291BD52AE
92 / 92 / 5
Регистрация: 04.03.2013
Сообщений: 295
21.03.2013, 17:57     Перезапуск таймера #6
на момент вызова
xbarmaglot
3 / 3 / 0
Регистрация: 06.10.2012
Сообщений: 248
21.03.2013, 19:27  [ТС]     Перезапуск таймера #7
Цитата Сообщение от c4sp3r Посмотреть сообщение
на момент вызова
нет, не уверен. более того - скорее всего он запущен, если я его руками останавливаю.
Я думал, что если он запущен, то остановится, а если нет - то ничего и не будет.
c4sp3r
0x5B4C322291BD52AE
92 / 92 / 5
Регистрация: 04.03.2013
Сообщений: 295
21.03.2013, 21:55     Перезапуск таймера #8
xbarmaglot, Забудь похоже я ошибся, такие вещи лучше в отладчике смотреть.
lifestyle
Mobile Developer
232 / 228 / 4
Регистрация: 10.05.2009
Сообщений: 917
23.03.2013, 23:09     Перезапуск таймера #9
код stopWotk and WorkTimer в студию пжалста...
а вообще с определенного времени я ярый противник таймеров в андроиде, лучше уже handler'ами пользоваться или asynctask'ом...
А вообще мне кажется странной конструкция основного if/else
может создаться два таймера и cancel сработает только на один - на последний... и судя по результатам
Цитата Сообщение от xbarmaglot Посмотреть сообщение
Через некоторое время он посылает несколько событий.
такой вариант очень реалистичен. для проверки этой теории добавь след код в метод run:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
if (m_work != null)
            {
                m_timer = new Timer("Timer on Date "+new Date(System.currentTimeMillis()).toString()); // добавил timestamp  к имени таймера, можешь не переводить его в дату а оставить как числовое значение timestamp
 
                m_timer.schedule(new WorkTimer(number)
                {
                    @Override
                    public void run()
                    {               
        
                        stopWork();
                        sendResult(JsonParser.VAL_START, true);             
                    }
                }, timeout * 1000);                 
            }
а в методе stopWork() добавь строку
Java
1
 Log.d("TIMER_NAME","Timer name is: Thread.currentThread.getName());
и в логе смотри все ли запущенные таймеры остановились и вообще запустился ли один таймер или более и сравни с тем сколько таймеров тебе нужно...
xbarmaglot
3 / 3 / 0
Регистрация: 06.10.2012
Сообщений: 248
24.03.2013, 18:51  [ТС]     Перезапуск таймера #10
Цитата Сообщение от lifestyle Посмотреть сообщение
код stopWotk and WorkTimer в студию пжалста...
а вообще с определенного времени я ярый противник таймеров в андроиде, лучше уже handler'ами пользоваться или asynctask'ом...
А вообще мне кажется странной конструкция основного if/else
может создаться два таймера и cancel сработает только на один - на последний... и судя по результатам
такой вариант очень реалистичен. для проверки этой теории добавь след код в метод run:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
if (m_work != null)
            {
                m_timer = new Timer("Timer on Date "+new Date(System.currentTimeMillis()).toString()); // добавил timestamp  к имени таймера, можешь не переводить его в дату а оставить как числовое значение timestamp
 
                m_timer.schedule(new WorkTimer(number)
                {
                    @Override
                    public void run()
                    {               
        
                        stopWork();
                        sendResult(JsonParser.VAL_START, true);             
                    }
                }, timeout * 1000);                 
            }
а в методе stopWork() добавь строку
Java
1
 Log.d("TIMER_NAME","Timer name is: Thread.currentThread.getName());
и в логе смотри все ли запущенные таймеры остановились и вообще запустился ли один таймер или более и сравни с тем сколько таймеров тебе нужно...
ну примерно так
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
    private synchronized void stopWork()
    {
        if (m_thread != null)
        {
            try
            {
                m_thread.interrupt();
                m_thread.join();                
            }
            catch (Exception ex)
            {
                Log.e(this.getClass().getName(), ex.getMessage());
            }
            finally
            {
                m_thread = null;
            }                
        }
    }
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
    private final boolean sendMessage(String number, String msg)
    {
        ArrayList<String> messages = m_smsManager.divideMessage(msg);
        assert(messages.size() == 1) : "Very large message";
        if (messages.size() == 1)
        {
            m_smsManager.sendTextMessage(number, null, msg, null, null);
            return true;            
        }
        return false;
    }
 
    private boolean sendResult(String method, boolean result)
    {
        String cmd = JsonParser.cmdResult(method, result);
        if (cmd == null)
        {
            return false;
        }
        Log.d(this.getClass().getName(), "Base64: " + cmd);
        sendMessage(method, cmd);
        return true;
    }
С логом понял. Попробую...
lifestyle
Mobile Developer
232 / 228 / 4
Регистрация: 10.05.2009
Сообщений: 917
26.03.2013, 18:58     Перезапуск таймера #11
Если не ошибаюсь interrupt depreceated давно уже, лучше использовать простейшую логику в методе run() например:

Java
1
2
3
4
5
6
@Override
public void run()  {
    while(!cancel) {
        //do something
    }
}
где cancel твой триггер на остановку потока. можешь сделать его глобальным и приватным с синхронизированными сеттером и геттером (setter - setCancel(boolean flag) and getter- boolean isCanceled() )...
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.03.2013, 19:34     Перезапуск таймера
Еще ссылки по теме:

Создание таймера - Программирование Android
Кто-нибудь может скинуть туториал по созданию таймера?! Хотелось бы научиться делать на студию, но материал не могу найти

Как из таймера обратиться к UI - Программирование Android
как из таймера обратиться к UI?? Возможна ли такая схема?? может через View.post(Runnable) как то можно??можете привести фрагмент кода?

Таинство создания таймера - Программирование Android
Привет. Возникла следующая проблема. При помощи клика создаем таймер. Вопрос: уничтожится ли старый объект взамен нового при следующем...

Приостановить таймер из таймера - Программирование Android
Есть задача мигать кнопкой. Но с большим интервалом! - длинная пауза - поменяли1 - короткая пауза - ... Как подобное можно сделать? ...


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

Или воспользуйтесь поиском по форуму:
V0v1k
1158 / 982 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
26.03.2013, 19:34     Перезапуск таймера #12
это stop depreceated, а interrupt просто не останавливает поток.
Yandex
Объявления
26.03.2013, 19:34     Перезапуск таймера
Ответ Создать тему
Опции темы

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