Форум программистов, компьютерный форум, киберфорум
Наши страницы
Программирование Android
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
disx
23 / 23 / 0
Регистрация: 26.02.2014
Сообщений: 621
Записей в блоге: 1
1

Как убить поток в CountDownTimer?

29.03.2017, 11:34. Просмотров 1015. Ответов 15
Метки нет (Все метки)

Привет, бойцам невидимого фронта!

есть эдакий кастомный CountDownTimer.java:

Кликните здесь для просмотра всего текста
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
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
package com.dis.medprog;
 
/*
 * Copyright (C) 2008 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      [url]http://www.apache.org/licenses/LICENSE-2.0[/url]
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
 
import android.os.Message;
import android.os.SystemClock;
 
        import android.os.Handler;
        import android.os.SystemClock;
        import android.os.Message;
 
/**
 * Schedule a countdown until a time in the future, with
 * regular notifications on intervals along the way.
 *
 * Example of showing a 30 second countdown in a text field:
 *
 * <pre class="prettyprint">
 * new CountdownTimer(30000, 1000) {
 *
 *     public void onTick(long millisUntilFinished) {
 *         mTextField.setText("seconds remaining: " + millisUntilFinished / 1000);
 *     }
 *
 *     public void onFinish() {
 *         mTextField.setText("done!");
 *     }
 *  }.start();
 * </pre>
 *
 * The calls to {@link #onTick(long)} are synchronized to this object so that
 * one call to {@link #onTick(long)} won't ever occur before the previous
 * callback is complete.  This is only relevant when the implementation of
 * {@link #onTick(long)} takes an amount of time to execute that is significant
 * compared to the countdown interval.
 */
public abstract class CountDownTimer {
 
    /**
     * Millis since epoch when alarm should stop.
     */
    private final long mMillisInFuture;
 
    /**
     * The interval in millis that the user receives callbacks
     */
    private final long mCountdownInterval;
 
    private long mStopTimeInFuture;
 
    private long mPauseTime;
 
    private boolean mCancelled = false;
 
    private boolean mPaused = false;
 
    /**
     * @param millisInFuture The number of millis in the future from the call
     *   to {@link #start()} until the countdown is done and {@link #onFinish()}
     *   is called.
     * @param countDownInterval The interval along the way to receive
     *   {@link #onTick(long)} callbacks.
     */
    public CountDownTimer(long millisInFuture, long countDownInterval) {
        mMillisInFuture = millisInFuture;
        mCountdownInterval = countDownInterval;
    }
 
    /**
     * Cancel the countdown.
     *
     * Do not call it from inside CountDownTimer threads
     */
    public final void cancel() {
        mHandler.removeMessages(MSG);
        mCancelled = true;
    }
 
    /**
     * Start the countdown.
     */
    public synchronized final CountDownTimer start() {
        if (mMillisInFuture <= 0) {
            onFinish();
            return this;
        }
        mStopTimeInFuture = SystemClock.elapsedRealtime() + mMillisInFuture;
        mHandler.sendMessage(mHandler.obtainMessage(MSG));
        mCancelled = false;
        mPaused = false;
        return this;
    }
 
    /**
     * Pause the countdown.
     */
    public long pause() {
        mPauseTime = mStopTimeInFuture - SystemClock.elapsedRealtime();
        mPaused = true;
        return mPauseTime;
    }
 
    /**
     * Resume the countdown.
     */
    public long resume() {
        mStopTimeInFuture = mPauseTime + SystemClock.elapsedRealtime();
        mPaused = false;
        mHandler.sendMessage(mHandler.obtainMessage(MSG));
        return mPauseTime;
    }
 
    /**
     * Callback fired on regular interval.
     * @param millisUntilFinished The amount of time until finished.
     */
    public abstract void onTick(long millisUntilFinished);
 
    /**
     * Callback fired when the time is up.
     */
    public abstract void onFinish();
 
 
    private static final int MSG = 1;
 
 
    // handles counting down
    private Handler mHandler = new Handler() {
 
        @Override
        public void handleMessage(Message msg) {
 
            synchronized (CountDownTimer.this) {
                if (!mPaused) {
                    final long millisLeft = mStopTimeInFuture - SystemClock.elapsedRealtime();
 
                    if (millisLeft <= 0) {
                        onFinish();
                    } else if (millisLeft < mCountdownInterval) {
                        // no tick, just delay until done
                        sendMessageDelayed(obtainMessage(MSG), millisLeft);
                    } else {
                        long lastTickStart = SystemClock.elapsedRealtime();
                        onTick(millisLeft);
 
                        // take into account user's onTick taking time to execute
                        long delay = lastTickStart + mCountdownInterval - SystemClock.elapsedRealtime();
 
                        // special case: user's onTick took more than interval to
                        // complete, skip to next interval
                        while (delay < 0) delay += mCountdownInterval;
 
                        if (!mCancelled) {
                            sendMessageDelayed(obtainMessage(MSG), delay);
                        }
                    }
                }
            }
        }
    };
}


Вызываю его методы в MainActivity, инициализирую по кнопке старт вот так:

Кликните здесь для просмотра всего текста
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
 private void startTimer(long totalTimeCountInMilliseconds) {
        countDownTimer = new CountDownTimer(totalTimeCountInMilliseconds, 1000) {
            // 500 means, onTick function will be called at every 500
            // milliseconds
            @Override
            public void onTick(long leftTimeInMilliseconds) {
                long seconds = leftTimeInMilliseconds / 1000;
                tvText.setText(String.format("%02d", seconds / 60)
                        + ":" + String.format("%02d", seconds % 60));
            }
            @Override
            public void onFinish() {
                Toast.makeText(getApplicationContext(), "Конец сеанса", Toast.LENGTH_SHORT).show();
                tvText.setText(String.format("%02d", 0)
                        + ":" + String.format("%02d", 0));
                buttonStartStropTime.setText("СТАРТ");
                buttonStartStropTime.setCompoundDrawablesWithIntrinsicBounds(0, R.drawable.play_ic, 0, 0);
                startStop = true;
                pauseFlag = 1;
                Button button = (Button) findViewById(R.id.buttonPause);
                button.setClickable(true);
            }
        }.start();
    }


все красиво работает: .start() потом вызываю
Java
1
countDownTimer.pause();
останавливается, продолжить делаю
Java
1
countDownTimer.resume();
НО,

когда нажимаю кнопку Reset с методом
Java
1
countDownTimer.cancel();
, задаю новое время, нажимаю старт, И ВСЕ НАЧИНАЕТСЯ С МЕСТА ГДЕ БЫЛА НАЖАТА ПАУЗА,

помогите ПОЖАЛУЙСТА побороть?
0
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.03.2017, 11:34
Ответы с готовыми решениями:

Убить поток в адаптере
После Делфи не до конца понимаю работу &quot;сборщика мусора&quot; Явы. Привык &quot;подчищать&quot; за собой сам. ...

CountDownTimer запуск в цикле
У меня есть класс где я реализовал таймер: package com.lineup.intervaltimer; import...

Не могу остановить CountDownTimer
Всем доброго времени суток. Пытаюсь написать таймер обратного отсчета до определенной даты и...

CountDownTimer сбрасывает экран
Если во время того, как был запущен таймер закрыть activity, то после того, как таймер закончится,...

Сделать бесконечный CountDownTimer
Использую CountDownTimer он в моем случае удобней обычного Timer, но проблема в том , что время...

15
shavuz
114 / 120 / 26
Регистрация: 29.01.2014
Сообщений: 609
29.03.2017, 14:36 2
покажите как вы используете startTimer
0
disx
23 / 23 / 0
Регистрация: 26.02.2014
Сообщений: 621
Записей в блоге: 1
29.03.2017, 15:44  [ТС] 3
shavuz, на кнопке СТАРТ/ПАУЗА такое:

Кликните здесь для просмотра всего текста
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
25
26
27
28
29
30
31
32
33
34
35
36
37
  if (startStop) {
                Log.d("DisLog", "Start" + String.valueOf(totalTimeCountInMilliseconds));
 
                if (tvText.getText().toString().equals("00:00")) {
                    Toast.makeText(getApplicationContext(), "Установите время или выберите параметры сеанса!", Toast.LENGTH_SHORT).show();
                } else {
                    //totalTimeCountInMilliseconds = 12354;
                    if (pauseFlag == 1) {
                        metFormatTime();
                        countDownTimer.resume();
                        startStop = false;
                        buttonStartStropTime.setText("ПАУЗА");
                        buttonStartStropTime.setCompoundDrawablesWithIntrinsicBounds(0, R.drawable.pause_ic, 0, 0);
 
                    } else {
                        metFormatTime();
                        startTimer(totalTimeCountInMilliseconds);
                        startStop = false;
                        buttonStartStropTime.setText("ПАУЗА");
                        buttonStartStropTime.setCompoundDrawablesWithIntrinsicBounds(0, R.drawable.pause_ic, 0, 0);
                        Button button = (Button) findViewById(R.id.buttonPause);
                        button.setClickable(false);
                    }
 
                }
 
            } else {
                countDownTimer.pause();
                Button button = (Button) findViewById(R.id.buttonPause);
                button.setClickable(true);
                metFormatTime();
                pauseFlag = 1;
                startStop = true;
 
                buttonStartStropTime.setText("СТАРТ");
                buttonStartStropTime.setCompoundDrawablesWithIntrinsicBounds(0, R.drawable.play_ic, 0, 0);
            }
0
shavuz
114 / 120 / 26
Регистрация: 29.01.2014
Сообщений: 609
29.03.2017, 15:51 4
не увидел там запуска функци старт таймер, 1)может у вас несколько раз создается таймер?
2)попробуйте его обнулить после countDownTimer.cancel();
0
Pablito
2865 / 2277 / 768
Регистрация: 12.05.2014
Сообщений: 7,978
Завершенные тесты: 1
29.03.2017, 16:02 5
я не понимаю, неужели так сложно решить задачу БЕЗ этих Countdowntimer-ов?
могу и ошибаться, но у него нет такого понятия как перезапустить - только новый объект создавать

если стоит задача просто показывать в каком-то textview счетчик секунд + старт, пауза, стоп, перезапуск
то это класс .... навскидку строк 30-40 максимум
1
ExFau$t
1026 / 808 / 247
Регистрация: 08.05.2012
Сообщений: 3,844
29.03.2017, 16:10 6
Возможно, Паблито имел в виду что-то такое: Таймер Android Studio
Я тоже придерживаюсь такого мнения.
1
Pablito
29.03.2017, 16:16
  #7

Не по теме:

я бы вообще через postDelayed сделал бы в пару методов

0
disx
23 / 23 / 0
Регистрация: 26.02.2014
Сообщений: 621
Записей в блоге: 1
29.03.2017, 16:55  [ТС] 8
shavuz,

1. сам метод startTimer(totalTimeCountInMilliseconds):

Кликните здесь для просмотра всего текста
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
25
26
27
28
29
private void startTimer(long totalTimeCountInMilliseconds) {
 
        countDownTimer = new CountDownTimer(totalTimeCountInMilliseconds, 1000) {
            // 500 means, onTick function will be called at every 500
            // milliseconds
            @Override
            public void onTick(long leftTimeInMilliseconds) {
                long seconds = leftTimeInMilliseconds / 1000;
                tvText.setText(String.format("%02d", seconds / 60)
                        + ":" + String.format("%02d", seconds % 60));
            }
            @Override
            public void onFinish() {
                OurSoundPlayer.playSound(getApplicationContext(), R.raw.sms);
                Toast.makeText(getApplicationContext(), "Конец сеанса", Toast.LENGTH_SHORT).show();
                tvText.setText(String.format("%02d", 0)
                        + ":" + String.format("%02d", 0));
                buttonStartStropTime.setText("СТАРТ");
                buttonStartStropTime.setCompoundDrawablesWithIntrinsicBounds(0, R.drawable.play_ic, 0, 0);
                startStop = true;
                pauseFlag = 1;
                Button button = (Button) findViewById(R.id.buttonPause);
                button.setClickable(true);
               // if (Tables.COUNT_DAY!=0){
                    Tables.COUNT_DAY++;
                //}
            }
        }.start();
    }

2. если под обнулить имеется ввиду, присвоить в totalTimeCountInMilliseconds 00:00, то так не помогает..

Паблито,
Цитата Сообщение от Паблито Посмотреть сообщение
но у него нет такого понятия как перезапустить
я думал pause() и resume() решают эту задачу...
ExFau$t, посмотрю просто тут уже все "допилено" кроме "как сделать reset?".

Добавлено через 4 минуты
Цитата Сообщение от Паблито Посмотреть сообщение
я бы вообще через postDelayed сделал бы в пару методов
просто стоял еще вопрос "плавности хода", т.е. напр. Chronometr или стандартный CountDownTimer проскакивают пара секунд когда делаешь пауза/запуск, а иногда и в начале... а этот вполне ровно работал вот я его и принял...

если ничо с этим не получится буду ковырять и фаустовский пример и postDelayed смотреть с чем едят (плина времени жалко.....)
0
Pablito
2865 / 2277 / 768
Регистрация: 12.05.2014
Сообщений: 7,978
Завершенные тесты: 1
29.03.2017, 17:53 9
типа таймер, может идти как в + так и обратный отсчет
Кликните здесь для просмотра всего текста
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
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
/**
 * Created by Eugene on 29.03.2017
 */
 
class AwesomeTimer {
 
    private static final int INTERVAL = 1000;
    private TextView textView;
    private int from;
    private int to;
    private int current;
    private boolean isPaused;
 
    AwesomeTimer(TextView textView) {
        this.textView = textView;
    }
 
    void start(int from, int to) {
        this.from = from;
        this.to = to;
        this.current = from;
        update(0);
    }
 
    void toggle() {
        isPaused = !isPaused;
        if (isPaused()) {
            textView.removeCallbacks(action);
        } else {
            textView.postDelayed(action, INTERVAL);
        }
    }
 
    void restart() {
        textView.removeCallbacks(action);
        isPaused = false;
        start(from, to);
    }
 
    private void update(int delay) {
        if (!isPaused) {
            textView.postDelayed(action, delay);
        }
    }
 
    boolean isPaused() {
        return isPaused;
    }
 
    void destroy() {
        textView.removeCallbacks(action);
        textView = null;
    }
    private final Runnable action = new Runnable() {
        @Override
        public void run() {
            textView.setText(String.valueOf(current));
            int shift = from < to ? 1 : -1;
            current += shift;
            update(INTERVAL);
        }
    };
}


на всякий пожарный пример как с ним работать
Кликните здесь для просмотра всего текста
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
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
 
    private AwesomeTimer timer;
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
 
        final TextView textView = (TextView) findViewById(R.id.textView);
        timer = new AwesomeTimer(textView);
 
        findViewById(R.id.start).setOnClickListener(this);
        findViewById(R.id.toggle).setOnClickListener(this);
        findViewById(R.id.restart).setOnClickListener(this);
    }
 
    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.start:
                timer.start(30, 0);
                break;
            case R.id.toggle:
                timer.toggle();
                ((Button) v).setText(timer.isPaused() ? "resume" : "pause");
                break;
            case R.id.restart:
                timer.restart();
                break;
        }
    }
 
    @Override
    protected void onDestroy() {
        timer.destroy();
        super.onDestroy();
    }
}

разметку наверное нет смысла приводить и так понятно что три кнопки + текствью

я бы еще добавил в класс таймера вложенный интерфейс что-то типа
Java
1
2
3
4
5
6
7
8
class AwesomeTimer {
 
    ...
    interface Callbacks {
        void onTick(int current);
        void onToggle(boolean isPaused);
    }
}
ну или какие там нужны реально методы и активити пусть имплементит этот интерфейс
1
disx
23 / 23 / 0
Регистрация: 26.02.2014
Сообщений: 621
Записей в блоге: 1
30.03.2017, 13:54  [ТС] 10
Паблито, отличный пример, но пытаюсь адаптировать его под себя и не догоняю некоторые моменты:

1) где изменить чтобы таймеру отдавать значения в long (мне нужно сетить в tv в таком формате 00:00), для этого использовал:
Java
1
2
3
4
5
6
7
CountDownTimer(totalTimeCountInMilliseconds, 1000) {
            @Override
            public void onTick(long leftTimeInMilliseconds) {
                long seconds = leftTimeInMilliseconds / 1000;
                tvText.setText(String.format("%02d", seconds / 60)
                        + ":" + String.format("%02d", seconds % 60));
            }
2) кроме изменения на одной кнопке надписи "start"/"pause", нужно менять еще и иконку, делал это так:
Java
1
2
((Button) v).setCompoundDrawablesWithIntrinsicBounds(0,R.drawable.play_ic,0,0);
((Button) v).setCompoundDrawablesWithIntrinsicBounds(0,R.drawable.pause_ic,0,0);

как можно сделать это подобным выражением
Java
1
((Button) v).setText(timer.isPaused() ? "СТАРТ" : "ПАУЗА");
3) Интерфейс добавил методы реализовал, но в onTick(), ничего не тикает(т.е. tvText не обновляется):
Java
1
2
3
4
5
6
 @Override
    public void onTick(long current) {
        long seconds = current / 1000;
        tvText.setText(String.format("%02d", seconds / 60)
                + ":" + String.format("%02d", seconds % 60));
    }
подскажи пожалуйста по возможности как доделать?

Добавлено через 17 минут
и вообще если мы отдаем tvText здесь
Java
1
timer = new AwesomeTimer(tvText);
то onTick() как бы не нужен, но тогда вопрос с отображением в формате mm:ss... где это лучше форматировать?
0
Pablito
2865 / 2277 / 768
Регистрация: 12.05.2014
Сообщений: 7,978
Завершенные тесты: 1
30.03.2017, 14:06 11
Кликните здесь для просмотра всего текста
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
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
package company.myapplication;
 
import android.widget.TextView;
 
import java.util.Locale;
 
/**
 * Created by Eugene on 29.03.2017
 */
 
class AwesomeTimer {
 
    private static final int INTERVAL = 1000;
    private TextView textView;
    private int from;
    private int to;
    private int current;
    private boolean isPaused;
 
    AwesomeTimer(TextView textView) {
        this.textView = textView;
    }
 
    void start(int from, int to) {
        textView.removeCallbacks(action);
        this.from = from / 1000;
        this.to = to / 1000;
        this.current = this.from;
        update(0);
    }
 
    void toggle() {
        isPaused = !isPaused;
        if (isPaused()) {
            textView.removeCallbacks(action);
        } else {
            textView.postDelayed(action, INTERVAL);
        }
    }
 
    void restart() {
        textView.removeCallbacks(action);
        isPaused = false;
        start(from, to);
    }
 
    private void update(int delay) {
        if (!isPaused) {
            textView.postDelayed(action, delay);
        }
    }
 
    boolean isPaused() {
        return isPaused;
    }
 
    void destroy() {
        textView.removeCallbacks(action);
        textView = null;
    }
 
    private final Runnable action = new Runnable() {
        @Override
        public void run() {
            textView.setText(String.format(Locale.ROOT, "%02d", current / 60)
                    + ":" + String.format(Locale.ROOT, "%02d", current % 60));
            int shift = from < to ? 1 : -1;
            current += shift;
            update(INTERVAL);
        }
    };
}

Цитата Сообщение от disx Посмотреть сообщение
2)
Java
1
2
3
4
                Button button = (Button) v;
                button.setText(timer.isPaused() ? "resume" : "pause");
                int id = timer.isPaused() ? R.drawable.play_ic : R.drawable.pause_ic;
                button.setCompoundDrawablesWithIntrinsicBounds(0, id, 0, 0);
Цитата Сообщение от disx Посмотреть сообщение
3) Интерфейс добавил методы реализовал, но в onTick(), ничего не тикает(т.е. tvText не обновляется):
про интерфейс я написал просто так, в данной реализации мы все равно передаем в таймер нужную текствью - пусть таймер ее и меняет

иначе если в таймер вместо текствью передавать слушатель который будет реализовывать все эти onTick и так далее, то придется выкручиваться с потоками, просто будет по-другому

если надо каждую секуду менять не просто текствью, а много разной магии то зачем вообще тогда таймер обратного отсчета?
0
disx
23 / 23 / 0
Регистрация: 26.02.2014
Сообщений: 621
Записей в блоге: 1
30.03.2017, 14:18  [ТС] 12
Паблито,
то зачем вообще тогда таймер обратного отсчета?
магия только в том чтобы после того как по таймеру сработал "тынь-дынь" сохранялись значения времени на начало отсчета, а при последующем запуске к этим значениям будут прибавляться еще и другие, и сумма времени подставляться в tvText. как-то так...
0
Pablito
2865 / 2277 / 768
Регистрация: 12.05.2014
Сообщений: 7,978
Завершенные тесты: 1
30.03.2017, 14:35 13
тогда что-то типа этого
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
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
import android.widget.TextView;
 
import java.util.Locale;
 
class AwesomeTimer {
 
    private static final int INTERVAL = 1000;
    private TextView textView;
    private OnTimerListener listener;
    private int from;
    private int to;
    private int current;
    private boolean isPaused;
 
    AwesomeTimer(TextView textView, OnTimerListener listener) {
        this.textView = textView;
        this.listener = listener;
    }
 
    void start(int from, int to) {
        textView.removeCallbacks(action);
        this.from = from;
        this.to = to;
        this.current = this.from;
        update(0);
        if (listener != null) {
            listener.onTimerStart();
        }
    }
 
    void toggle() {
        isPaused = !isPaused;
        if (isPaused()) {
            textView.removeCallbacks(action);
        } else {
            textView.postDelayed(action, INTERVAL);
        }
        if (listener != null) {
            listener.onTimerToggle(isPaused);
        }
    }
 
    void restart() {
        textView.removeCallbacks(action);
        isPaused = false;
        start(from, to);
    }
 
    private void update(int delay) {
        if (!isPaused) {
            textView.postDelayed(action, delay);
        }
    }
 
    boolean isPaused() {
        return isPaused;
    }
 
    void destroy() {
        textView.removeCallbacks(action);
        textView = null;
        listener = null;
    }
 
    private final Runnable action = new Runnable() {
        @Override
        public void run() {
            int sec = current / 1000;
            textView.setText(String.format(Locale.ROOT, "%02d", sec / 60)
                    + ":" + String.format(Locale.ROOT, "%02d", sec % 60));
            int shift = from < to ? 1000 : -1000;
            if (listener != null) {
                if (current == to) {
                    listener.onTimerEnd();
                } else {
                    listener.onTimerTick(current);
                    update(INTERVAL);
                }
            }
            current += shift;
        }
    };
 
    interface OnTimerListener {
        void onTimerTick(int currentTime);
        void onTimerStart();
        void onTimerEnd();
        void onTimerToggle(boolean isPaused);
    }
}
1
disx
23 / 23 / 0
Регистрация: 26.02.2014
Сообщений: 621
Записей в блоге: 1
03.04.2017, 12:05  [ТС] 14
Паблито, этот вариант сбрасывает tvText на нули и ничего не происходит...

кроме этого что должно быть в инициализации timer:

Java
1
2
3
4
   
private AwesomeTimer.OnTimerListener listener;
tvText.setText(timeForSession);
        timer = new AwesomeTimer(tvText,listener);
?

Java
1
 timer.start("тут надо long", 0);
0
Pablito
03.04.2017, 12:08
  #15

Не по теме:

я устал от этой глупой темы, бессмысленное переливание из пустого в порожнее там,где можно было за пол часа все понять

приглашаю сюда терпеливых отзывчивых людей, очень нужна их помощь

0
disx
23 / 23 / 0
Регистрация: 26.02.2014
Сообщений: 621
Записей в блоге: 1
03.04.2017, 13:28  [ТС] 16
Паблито,

Не по теме:

ну да, не врубался что нада Runnable разбирать..



все заработало....
0
03.04.2017, 13:28
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.04.2017, 13:28

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Борьба за TextView при работе с CountDownTimer
Добрый день. Проблема заключается в следующем: есть таймер, наследованный от CountDownTimer, его...

Остановка выполнения таймера (CountDownTimer) из другого класса
При входе в активити в методе onCreate выполняется таймер: new CountDownTimer(40000, 1000) { ...

Программно изменить TextView и остановить таймер в ListView с multiple CountDownTimer
Как по событию финишировать таймер и поменять TextView (tvStateClose и tvTimeRemainingClose) ? ...


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

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

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