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

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

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

Перезапуск таймера - Android

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

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

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

Такое ощущение, что не останавливается, а приостанавливается, а потом заново запускается.
Почему ?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
dr_yand
156 / 138 / 6
Регистрация: 13.03.2013
Сообщений: 321
Записей в блоге: 3
21.03.2013, 16:32     Перезапуск таймера #2
Приведите ваш код
xbarmaglot
3 / 3 / 0
Регистрация: 06.10.2012
Сообщений: 243
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
Сообщений: 243
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
Сообщений: 243
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
231 / 227 / 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
Сообщений: 243
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
231 / 227 / 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     Перезапуск таймера
Еще ссылки по теме:

Обновление/перезапуск layout по нажатию Android
Android Создание таймера
Android Вызов makeSomeThing() из-под Таймера
Android Перезапуск приложения после вкл/выкл разрешения на Marshmallow
Таинство создания таймера Android

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

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

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