Какие классы нужны для создания таймера?

Ответить
Gregory
Сообщения: 8
Зарегистрирован: 05 сен 2013, 18:06
Откуда: Краснодарский край
Контактная информация:

Какие классы нужны для создания таймера?

Сообщение Gregory » 22 янв 2015, 12:48

Всем привет!
Хочу написать обычный таймер. Искал в нете как это сделать, но там так много разных вариантов. Кто-то делает через класс CountDownTimer, кто-то советовал мне делать через класс Timer, видел даже реализацию где автор сделал таймер используя много if, switch и инкременты и декременты.
Мне как новичку очень сложно определиться, какой выбрать подход. Но вот в классе CountDownTimer я не нашел как ставить на паузу.
Вот я нашел парочку уроков:

http://androidsolution4u.blogspot.ru/20 ... timer.html
http://rusdelphi.com/help/krasivyj-tajmer-dlya-android/

Но из-за нехватки знаний я понимаю только половину кода.
Пожалуйста, опытные кодеры, подскажите на сегодняшний день какой способ создания таймера будет более простым и правильным? Очень не хватает совета, а желательно еще и элементарный код показать, с пояснением. Это было бы вообще супер и буду вам за это благодарен!

Более конкретно, мне не понятна часть кода после else:

@Override
public void onClick(View v) {

if(isRunning){
//cancel (pause) timer when it is running
mTimer.cancel();
mTimer=null;
isRunning=false;
btn_start.setText("Resume");

}else{


if (remainMilli == 0) {
//start timer from initial time
mTimer = new MyTimer(5 * 1000 *60, 1000);
} else {
//resume timer from where it is paused
mTimer = new MyTimer(remainMilli, 1000);
}
btn_start.setText("Pause");
mTimer.start();
isRunning=true;

}
не совсем понял условие if (remainMilli == 0) {
Что значит эта строка mTimer = new MyTimer(5 * 1000 *60, 1000);

Вот код целиком:

Код: Выделить всё

package com.ketan.countdowntimer;

import android.app.Activity;
import android.os.Bundle;
import android.os.CountDownTimer;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;

public class TimerActivity extends Activity {
   
     Button btn_start;
     TextView txt_remaintime;
     MyTimer mTimer;
     long remainMilli = 0;
     boolean isRunning=false;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
           super.onCreate(savedInstanceState);
           setContentView(R.layout.activity_timer);
    
          btn_start = (Button) findViewById(R.id.btn);
          txt_remaintime = (TextView) findViewById(R.id.text);

          btn_start.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                
                if(isRunning){
                    //cancel (pause) timer when it is running
                    mTimer.cancel();
                    mTimer=null;
                    isRunning=false;
                    btn_start.setText("Resume");
                    
                }else{

                    if (remainMilli == 0) {
                        //start timer from initial time
                        mTimer = new MyTimer(5 * 1000 *60, 1000);
                    } else {
                        //resume timer from where it is paused
                        mTimer = new MyTimer(remainMilli, 1000);
                    }
                    btn_start.setText("Pause");
                    mTimer.start();    
                    isRunning=true;
                }
                
            }
        });
    }

    

    class MyTimer extends CountDownTimer {




         //constructor for timer class
        public MyTimer(long millisInFuture, long countDownInterval) {
            super(millisInFuture, countDownInterval);
            
        }


       // this method called when timer is finished
        @Override
        public void onFinish() {
            // reset all variables
            txt_remaintime.setText("Opps!! Time Up..");
            btn_start.setText("Start");
            isRunning=false;
            remainMilli=0;
        }

         //this method is called for every iteration of time interval
        @Override
        public void onTick(long millisUntilFinished) {
            
            remainMilli = millisUntilFinished;
            
            //calculate minutes and seconds from milliseconds
            String minute=""+(millisUntilFinished/1000)/60;
            String second=""+(millisUntilFinished/1000)%60;
            
            //apply style to minute and second
            if((millisUntilFinished/1000)/60<10)
                minute="0"+(millisUntilFinished/1000)/60;
            if((millisUntilFinished/1000)%60<10)
                second="0"+(millisUntilFinished/1000)%60;
            
            // update textview with remaining time
            txt_remaintime.setText(minute+":"+second);
        }

    }
}
Последний раз редактировалось Gregory 22 янв 2015, 14:56, всего редактировалось 1 раз.

Аватара пользователя
klblk
Сообщения: 1097
Зарегистрирован: 18 окт 2012, 11:17
Откуда: г. Красноярск

Re: Какие классы нужны для создания таймера?

Сообщение klblk » 22 янв 2015, 13:46

0. Оформляйте код на форуме по людски.
1. remainMilli видимо тут сохраняется оставшееся время или что-то типа того, без полного кода не ясно... типа если оно равно 0 то стартует новый таймер, если нет, то продолжается с тогоже место где таймер остановился.
2. MyTimer - вероятно класс который наследуется от Timer. Но это лишь предположение. Но если это так, то "5 * 1000 *60" время работы таймера в милисекундах, 1000 период, т.е. каждую секунду будет что-то происходить.

Аватара пользователя
doter.ua
Сообщения: 1106
Зарегистрирован: 23 ноя 2013, 16:08
Откуда: Ukraine

Re: Какие классы нужны для создания таймера?

Сообщение doter.ua » 22 янв 2015, 14:48

Код: Выделить всё

handler = new Handler();

final Runnable r = new Runnable() {
    public void run() {
        Log.d(TAG, "Hello World");
        handler.postDelayed(this, 1000);
    }
};

handler.postDelayed(r, 1000);
Хендлер, который запускается спустя 1000мс ( 1 сек ), выводит хело ворлд и опять запускает себя (точнее планирует на запуск через 1000мс). Такая вот рекурсия.
Семь раз отмерь - поставь студию.
Эклипс не студия, ошибка вылетит - не исправишь.
Скажи мне кто твой друг, и оба поставили студию.
Студия - свет, а эклипс - тьма.

Gregory
Сообщения: 8
Зарегистрирован: 05 сен 2013, 18:06
Откуда: Краснодарский край
Контактная информация:

Re: Какие классы нужны для создания таймера?

Сообщение Gregory » 22 янв 2015, 15:00

klblk писал(а):Но если это так, то "5 * 1000 *60" время работы таймера в милисекундах, 1000 период, т.е. каждую секунду будет что-то происходить.
не совсем понял 5 * 1000 * 60. получается это все перемножается? Или это не 300 000 в мс?

И можете подсказать, мне нужно пробовать писать свой таймер, на классах Timer и TimerTask?

Аватара пользователя
doter.ua
Сообщения: 1106
Зарегистрирован: 23 ноя 2013, 16:08
Откуда: Ukraine

Re: Какие классы нужны для создания таймера?

Сообщение doter.ua » 22 янв 2015, 16:10

Gregory писал(а):
klblk писал(а):Но если это так, то "5 * 1000 *60" время работы таймера в милисекундах, 1000 период, т.е. каждую секунду будет что-то происходить.
не совсем понял 5 * 1000 * 60. получается это все перемножается? Или это не 300 000 в мс?

И можете подсказать, мне нужно пробовать писать свой таймер, на классах Timer и TimerTask?
Все зависит от цели. Про умножение: это шутка была? Чем вам пример с хендлером не нравится? В теле хендлера инкрементируете переменную - вот вам и таймер. if (myVariable = 60) - прошла минута и т.д.
Семь раз отмерь - поставь студию.
Эклипс не студия, ошибка вылетит - не исправишь.
Скажи мне кто твой друг, и оба поставили студию.
Студия - свет, а эклипс - тьма.

Gregory
Сообщения: 8
Зарегистрирован: 05 сен 2013, 18:06
Откуда: Краснодарский край
Контактная информация:

Re: Какие классы нужны для создания таймера?

Сообщение Gregory » 22 янв 2015, 16:51

doter.ua писал(а):
Gregory писал(а):
klblk писал(а):Но если это так, то "5 * 1000 *60" время работы таймера в милисекундах, 1000 период, т.е. каждую секунду будет что-то происходить.
не совсем понял 5 * 1000 * 60. получается это все перемножается? Или это не 300 000 в мс?

И можете подсказать, мне нужно пробовать писать свой таймер, на классах Timer и TimerTask?
Все зависит от цели. Про умножение: это шутка была? Чем вам пример с хендлером не нравится? В теле хендлера инкрементируете переменную - вот вам и таймер. if (myVariable = 60) - прошла минута и т.д.
Про умножение - нет, не шутка. Возможно я не привык к ситаксису. Но для меня понятней такая запись:

Код: Выделить всё

mTimer = new MyTimer(300 000, 1000);
вместо

Код: Выделить всё

mTimer = new MyTimer(5 * 1000 *60, 1000);
Можете объяснить этот момент? Это сделано для удобства или какая другая причина? Может знак * в данном случае не умножение? Вы можете подумать что я прикалываюсь, но я около месяца как занялся программированием, у меня нет никакой базы знаний за плечами, потому могу задавать "глупые вопросы" по вашему мнению))

Попробую и с хендлером, я все сейчас пробую. Просто он мне показался сложнее. Я еще не совсем разобрался с потоками, а почитав про хендлер в 80 - 84 и прочел:
Handler - это механизм, который позволяет работать с очередью сообщений. Он привязан к конкретному потоку (thread) и работает с его очередью.
То есть надо основательно изучить потоки)) я не то что бы хочу изучить минимум и чтобы все было. Нет)) я поставил себе задачу написать таймер и параллельно с изучением всех основ андроид разработки ищу способы как написать таймер. В дальнейшем у меня на хронометрах готовится проект и потому хотелось бы в первую очередь изучать только то что связано с этим. То есть направление моих программ будет с принципом таймеров и секундомеров связано.
Конечно можно использовать куски кода как шаблон, подставляя свой код внутри, но хочется понимать каждую строчку.

Аватара пользователя
KamiSempai
Сообщения: 1339
Зарегистрирован: 17 фев 2012, 21:23
Откуда: Мордор

Re: Какие классы нужны для создания таймера?

Сообщение KamiSempai » 22 янв 2015, 18:38

Gregory писал(а):Можете объяснить этот момент? Это сделано для удобства или какая другая причина? Может знак * в данном случае не умножение? Вы можете подумать что я прикалываюсь, но я около месяца как занялся программированием, у меня нет никакой базы знаний за плечами, потому могу задавать "глупые вопросы" по вашему мнению))
Это сделано для удобства так как 1000 в миллисекундах - это секунда, умножаем на 60 получаем минуту, минуту умножаем на 5, получаем 5 минут. 5 минут на много нагляднее чем 300 000 миллисекунд.
Gregory писал(а):Попробую и с хендлером, я все сейчас пробую. Просто он мне показался сложнее. Я еще не совсем разобрался с потоками, а почитав про хендлер в 80 - 84 и прочел:
Handler - это механизм, который позволяет работать с очередью сообщений. Он привязан к конкретному потоку (thread) и работает с его очередью.
То есть надо основательно изучить потоки)) я не то что бы хочу изучить минимум и чтобы все было. Нет)) я поставил себе задачу написать таймер и параллельно с изучением всех основ андроид разработки ищу способы как написать таймер. В дальнейшем у меня на хронометрах готовится проект и потому хотелось бы в первую очередь изучать только то что связано с этим. То есть направление моих программ будет с принципом таймеров и секундомеров связано.
Конечно можно использовать куски кода как шаблон, подставляя свой код внутри, но хочется понимать каждую строчку.
Если вы собираетесь работать со временем где нужна точность, дам очень важный совет. Не зависимо от того какой способ выберете, есть одна особенность, тик может сработать не через запланированное количество миллисекунд, а гораздо позже. Из за этого, каждый тик, из переменной "осталось времение" нужно вычитать не константу, а время прошедшее между тиками. То есть, нужно будет запоминать время когда произошел тик и в следующий раз получать прошедшее время как "текущее время" минус "время прошлого тика".

Тик - момент когда таймер пересчитывает оставшееся время. Обычно его выбирают равным 1000 миллисекунд = 1 секунда.

Если по завершении таймера нужно будет подать какой либо сигнал, нужно использовать AlarmManager, остальные таймеры на это совершенно не годятся.
R.id.team
Хватит таскать макулатуру на тренировку! Используй T Note.

Gregory
Сообщения: 8
Зарегистрирован: 05 сен 2013, 18:06
Откуда: Краснодарский край
Контактная информация:

Re: Какие классы нужны для создания таймера?

Сообщение Gregory » 22 янв 2015, 19:11

KamiSempai писал(а):
Gregory писал(а):Можете объяснить этот момент? Это сделано для удобства или какая другая причина? Может знак * в данном случае не умножение? Вы можете подумать что я прикалываюсь, но я около месяца как занялся программированием, у меня нет никакой базы знаний за плечами, потому могу задавать "глупые вопросы" по вашему мнению))
Это сделано для удобства так как 1000 в миллисекундах - это секунда, умножаем на 60 получаем минуту, минуту умножаем на 5, получаем 5 минут. 5 минут на много нагляднее чем 300 000 миллисекунд.
Gregory писал(а):Попробую и с хендлером, я все сейчас пробую. Просто он мне показался сложнее. Я еще не совсем разобрался с потоками, а почитав про хендлер в 80 - 84 и прочел:
Handler - это механизм, который позволяет работать с очередью сообщений. Он привязан к конкретному потоку (thread) и работает с его очередью.
То есть надо основательно изучить потоки)) я не то что бы хочу изучить минимум и чтобы все было. Нет)) я поставил себе задачу написать таймер и параллельно с изучением всех основ андроид разработки ищу способы как написать таймер. В дальнейшем у меня на хронометрах готовится проект и потому хотелось бы в первую очередь изучать только то что связано с этим. То есть направление моих программ будет с принципом таймеров и секундомеров связано.
Конечно можно использовать куски кода как шаблон, подставляя свой код внутри, но хочется понимать каждую строчку.
Если вы собираетесь работать со временем где нужна точность, дам очень важный совет. Не зависимо от того какой способ выберете, есть одна особенность, тик может сработать не через запланированное количество миллисекунд, а гораздо позже. Из за этого, каждый тик, из переменной "осталось времение" нужно вычитать не константу, а время прошедшее между тиками. То есть, нужно будет запоминать время когда произошел тик и в следующий раз получать прошедшее время как "текущее время" минус "время прошлого тика".

Тик - момент когда таймер пересчитывает оставшееся время. Обычно его выбирают равным 1000 миллисекунд = 1 секунда.

Если по завершении таймера нужно будет подать какой либо сигнал, нужно использовать AlarmManager, остальные таймеры на это совершенно не годятся.
Вроде и сам мог догадаться про 5 * 1000 * 60 )) спасибо за объяснение. Действительно удобнее)) и спасибо за совет с точностью времени! Обязательно это учту.

Я пару дней рою инет на тему таймера и пришел к выводу, что более гибкий и удобный способ использовать класс Timer, он имеет все необходимые методы, в отличие от того же CountDownTimer. Конечно, для новичка (меня) класс Timer может показаться более сложным по количеству кода. Но все же класс Timer мне кажется больше всего подходит для моих целей. Не прокомментируете мой выбор? В плане если бы вы делали программы базирующиеся на таймерах, секундамерах какой способ реализации выбрали бы вы?

Если вас не затруднит, то могли бы вы написать пример кода с классом Timer?

Gregory
Сообщения: 8
Зарегистрирован: 05 сен 2013, 18:06
Откуда: Краснодарский край
Контактная информация:

Re: Какие классы нужны для создания таймера?

Сообщение Gregory » 22 янв 2015, 22:29

Кто-нибудь мог бы объяснить этот фрагмент кода

Код: Выделить всё

@Override 
            public void onClick(View v) { 
                 
                if(isRunning){ 
                    //cancel (pause) timer when it is running 
                    mTimer.cancel(); 
                    mTimer=null; 
                    isRunning=false; 
                    btn_start.setText("Resume"); 
для чего нужна строка mTimer=null; ?

И условие звучит так?
Если (isRunning лож) то тогда таймер ставится на паузу (отменятся выполнение задачи) mTimer.cancel();
Но зачем тогда писать строчку isRunning=false; если она и так получается false из условия. Иначе бы условие не выполнялось.
И нельзя ли использовать isRunning=true; ? вроде как получается is Running если перевести является запущенным. Или я что-то упустил?

Я не понимаю этот момент. Уже пару часов сижу над этим кодом в Студии))

Аватара пользователя
petrovichtim
Сообщения: 77
Зарегистрирован: 11 фев 2014, 22:53
Откуда: Москва
Контактная информация:

Re: Какие классы нужны для создания таймера?

Сообщение petrovichtim » 22 янв 2015, 22:46

Пиши на rusdelphi.com в комментарии, там тебе и отвечу на все вопросы . Таймеры очень специфическая тема.

Аватара пользователя
klblk
Сообщения: 1097
Зарегистрирован: 18 окт 2012, 11:17
Откуда: г. Красноярск

Re: Какие классы нужны для создания таймера?

Сообщение klblk » 23 янв 2015, 07:38

Не понимаю что такого специфичного в таймерах? А уж тем более давать для этого ссылку на непонятный ресурс? Почему бы не ответить тут? (просто не красиво получается по отношению к автору startandroid)
но это лирика.
Gregory писал(а):Кто-нибудь мог бы объяснить этот фрагмент кода

Код: Выделить всё

@Override 
            public void onClick(View v) { 
                 
                if(isRunning){ 
                    //cancel (pause) timer when it is running 
                    mTimer.cancel(); 
                    mTimer=null; 
                    isRunning=false; 
                    btn_start.setText("Resume"); 
для чего нужна строка mTimer=null; ?

И условие звучит так?
Если (isRunning лож) то тогда таймер ставится на паузу (отменятся выполнение задачи) mTimer.cancel();
Но зачем тогда писать строчку isRunning=false; если она и так получается false из условия. Иначе бы условие не выполнялось.
И нельзя ли использовать isRunning=true; ? вроде как получается is Running если перевести является запущенным. Или я что-то упустил?

Я не понимаю этот момент. Уже пару часов сижу над этим кодом в Студии))
isRunning - переменная которая которая говорит запущен таймер или нет.
"Если (isRunning лож) то тогда таймер ставится на паузу" - вот это вы откуда взяли? наоборот если (isRunning == true), т.е. таймер запущен, то его останавливаем и делаем isRunning = false, т.к. таймер больше не работает. Соответственно если таймер не запущен (isRunning == false), то этот код не будет выполнятся

Аватара пользователя
petrovichtim
Сообщения: 77
Зарегистрирован: 11 фев 2014, 22:53
Откуда: Москва
Контактная информация:

Re: Какие классы нужны для создания таймера?

Сообщение petrovichtim » 23 янв 2015, 08:56

klblk писал(а):Не понимаю что такого специфичного в таймерах? А уж тем более давать для этого ссылку на непонятный ресурс? Почему бы не ответить тут? (просто не красиво получается по отношению к автору startandroid)
Это мой блог. Ничего некрасивого я не вижу, или у вас тут монополия на знания?

Аватара пользователя
klblk
Сообщения: 1097
Зарегистрирован: 18 окт 2012, 11:17
Откуда: г. Красноярск

Re: Какие классы нужны для создания таймера?

Сообщение klblk » 23 янв 2015, 09:13

petrovichtim писал(а):
klblk писал(а):Не понимаю что такого специфичного в таймерах? А уж тем более давать для этого ссылку на непонятный ресурс? Почему бы не ответить тут? (просто не красиво получается по отношению к автору startandroid)
Это мой блог. Ничего некрасивого я не вижу, или у вас тут монополия на знания?
В моем видении это просто спам. Все было бы нормально если бы ваша ссылка вела на пример решения данной проблемы или хоть как-то относилась к таймерам.
Если бы вы действительно хотели помочь человеку, то сделали бы это прямо здесь и сейчас, без лишних ссылок.

upd сори не заметил, что топикстартер какраз ссылается на вашу статью. Извиняюсь. Но все же и вам вероятно тоже нужно было указать на нее ссылку.

Аватара пользователя
petrovichtim
Сообщения: 77
Зарегистрирован: 11 фев 2014, 22:53
Откуда: Москва
Контактная информация:

Re: Какие классы нужны для создания таймера?

Сообщение petrovichtim » 23 янв 2015, 10:24

klblk писал(а):
petrovichtim писал(а):
klblk писал(а):Не понимаю что такого специфичного в таймерах? А уж тем более давать для этого ссылку на непонятный ресурс? Почему бы не ответить тут? (просто не красиво получается по отношению к автору startandroid)
Это мой блог. Ничего некрасивого я не вижу, или у вас тут монополия на знания?
В моем видении это просто спам. Все было бы нормально если бы ваша ссылка вела на пример решения данной проблемы или хоть как-то относилась к таймерам.
Если бы вы действительно хотели помочь человеку, то сделали бы это прямо здесь и сейчас, без лишних ссылок.

upd сори не заметил, что топикстартер какраз ссылается на вашу статью. Извиняюсь. Но все же и вам вероятно тоже нужно было указать на нее ссылку.
там вообще-то 3 статьи по таймерам
и 4-ю надо бы написать. но некогда.

Gregory
Сообщения: 8
Зарегистрирован: 05 сен 2013, 18:06
Откуда: Краснодарский край
Контактная информация:

Re: Какие классы нужны для создания таймера?

Сообщение Gregory » 23 янв 2015, 11:12

klblk писал(а):Не понимаю что такого специфичного в таймерах? А уж тем более давать для этого ссылку на непонятный ресурс? Почему бы не ответить тут? (просто не красиво получается по отношению к автору startandroid)
но это лирика.
Gregory писал(а):Кто-нибудь мог бы объяснить этот фрагмент кода

Код: Выделить всё

@Override 
            public void onClick(View v) { 
                 
                if(isRunning){ 
                    //cancel (pause) timer when it is running 
                    mTimer.cancel(); 
                    mTimer=null; 
                    isRunning=false; 
                    btn_start.setText("Resume"); 
для чего нужна строка mTimer=null; ?

И условие звучит так?
Если (isRunning лож) то тогда таймер ставится на паузу (отменятся выполнение задачи) mTimer.cancel();
Но зачем тогда писать строчку isRunning=false; если она и так получается false из условия. Иначе бы условие не выполнялось.
И нельзя ли использовать isRunning=true; ? вроде как получается is Running если перевести является запущенным. Или я что-то упустил?

Я не понимаю этот момент. Уже пару часов сижу над этим кодом в Студии))
isRunning - переменная которая которая говорит запущен таймер или нет.
"Если (isRunning лож) то тогда таймер ставится на паузу" - вот это вы откуда взяли? наоборот если (isRunning == true), т.е. таймер запущен, то его останавливаем и делаем isRunning = false, т.к. таймер больше не работает. Соответственно если таймер не запущен (isRunning == false), то этот код не будет выполнятся
Нашел свою ошибку. Я просто не знал что подобное условие
if (isRunning) равносильно if (isRunning == true).
Я думал, что if (isRunning) означает false, так как при объявлении этой переменной было указано false. Но теперь разобрался. Если в скобках (условие) указана просто переменная, то это означает что переменная = истина.

Вроде малюсенькое недопонимания кода и из-за него упустил логику кода. Теперь все норм. Благодарю!

Gregory
Сообщения: 8
Зарегистрирован: 05 сен 2013, 18:06
Откуда: Краснодарский край
Контактная информация:

Re: Какие классы нужны для создания таймера?

Сообщение Gregory » 23 янв 2015, 11:40

Все! Разобрался во всем и полностью написал данный код, не подглядывая в пример. Теперь понятна каждая строчка кода. Очень благодарен всем за вашу помощь! Приятно когда столько отзывчивых людей)))
Теперь приступаю к таймеру по другой ссылке))

Аватара пользователя
ivannatobedev
Сообщения: 30
Зарегистрирован: 03 дек 2014, 13:27

Re: Какие классы нужны для создания таймера?

Сообщение ivannatobedev » 27 янв 2015, 10:15

Тоже нужна помощь с таймером. Идея: есть два таймера, каждый со своим таском. При срабатывании первого - срабатывает второй, отрабатывает и выключается...и т.д. Первый раз срабатывает корректно, канцелится, а при втором срабатывании - ошибка. Пробовал всяко. В данный момент ошибка: TimerTask is scheduled already. Ошибка в строке: MainActivity.this.timer.schedule(task, 100, 1000);.

Код: Выделить всё

public void onClick2(View v){

        timer1 = new Timer();
        task1 = new TimerTask() {
            @Override
            public void run() {
                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        message2 = new Message();
                        message2 = socketThread.handlerOut.obtainMessage(2);
                        socketThread.handlerOut.sendMessage(message2);
                        if(MainActivity.this.timer!=null || MainActivity.this.task!=null)
                        {
                           // MainActivity.this.task.cancel();
                            MainActivity.this.timer.purge();
                            MainActivity.this.timer.cancel();
                        }
                        MainActivity.this.timer = new Timer();
                        MainActivity.this.timer.schedule(task, 100, 1000);
                    }
                });
            }
        };timer1.schedule(task1, 1 , 10000);

        this.timer = new Timer();
        task = new TimerTask() {
            @Override
            public void run() {

                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        String text3 = textView3.getText().toString();
                        if(socketThread.responseGs.length()<=0 || socketThread.responseGs.equals(text3))
                        {
                            return;
                        }
                        else
                        {
                            switch (socketThread.responseGs.charAt(2))
                            {
                                case 0: textView3.setText(text3 + '\n' + socketThread.responseGs); break;
                                case 1: textView3.setText(text3 + '\n' + socketThread.responseGs); break;
                                case 2: textView3.setText(text3 + '\n' + socketThread.responseGs); break;
                            }

                            MainActivity.this.task.cancel();
                            MainActivity.this.timer.purge();
                            MainActivity.this.timer.cancel();
                        }
                    }
                });   
  }
        };}


Аватара пользователя
Yennefer
Сообщения: 18
Зарегистрирован: 02 янв 2015, 17:36

Re: Какие классы нужны для создания таймера?

Сообщение Yennefer » 27 янв 2015, 12:37

Gregory писал(а): Я думал, что if (isRunning) означает false, так как при объявлении этой переменной было указано false. Но теперь разобрался. Если в скобках (условие) указана просто переменная, то это означает что переменная = истина.
Это неверно.
Если isRunning находится в скобочках if (...), это не означает, что он однозначно является истиной.
Это всего лишь значит, что выполняется проверка, является ли выражение в скобочках (в данном случае переменная isRunning) истиной.
isRunning может принимать значения true или false, и неизвестно чему она равна в момент проверки.
В вашем случае нужно понимать выражение

Код: Выделить всё

if(isRunning){  
  ...
  isRunning=false;  
  ...
}
так:

Если (isRunning) = true (т.е. таймер запущен), то делаем isRunning = false (т.е. выключаем таймер).
Если (isRunning) = false (т.е. таймер не запущен), то проходим мимо, условия в {} не выполняем.

Ответить