Форум программистов, компьютерный форум, киберфорум
Программирование Android
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.85/13: Рейтинг темы: голосов - 13, средняя оценка - 4.85
23 / 23 / 0
Регистрация: 26.02.2014
Сообщений: 684

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

29.03.2017, 11:34. Показов 2565. Ответов 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
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
29.03.2017, 11:34
Ответы с готовыми решениями:

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

Как убить поток???
Добрый день всем! Подскажите пожалуйста, как убить поток, не дожидаясь окончания выполнения функции, связанной с ним???

Как убить зависший поток?
В методе который запускается в потоке есть участок кода где посылаются запросы через прокси, на этом участке поток может бесконечно...

15
114 / 120 / 26
Регистрация: 29.01.2014
Сообщений: 609
29.03.2017, 14:36
покажите как вы используете startTimer
0
23 / 23 / 0
Регистрация: 26.02.2014
Сообщений: 684
29.03.2017, 15:44  [ТС]
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
114 / 120 / 26
Регистрация: 29.01.2014
Сообщений: 609
29.03.2017, 15:51
не увидел там запуска функци старт таймер, 1)может у вас несколько раз создается таймер?
2)попробуйте его обнулить после countDownTimer.cancel();
0
2884 / 2296 / 769
Регистрация: 12.05.2014
Сообщений: 7,978
29.03.2017, 16:02
я не понимаю, неужели так сложно решить задачу БЕЗ этих Countdowntimer-ов?
могу и ошибаться, но у него нет такого понятия как перезапустить - только новый объект создавать

если стоит задача просто показывать в каком-то textview счетчик секунд + старт, пауза, стоп, перезапуск
то это класс .... навскидку строк 30-40 максимум
1
1570 / 1168 / 426
Регистрация: 08.05.2012
Сообщений: 5,219
29.03.2017, 16:10
Возможно, Паблито имел в виду что-то такое: Таймер Android Studio
Я тоже придерживаюсь такого мнения.
1
29.03.2017, 16:16

Не по теме:

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

0
23 / 23 / 0
Регистрация: 26.02.2014
Сообщений: 684
29.03.2017, 16:55  [ТС]
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
2884 / 2296 / 769
Регистрация: 12.05.2014
Сообщений: 7,978
29.03.2017, 17:53
типа таймер, может идти как в + так и обратный отсчет
Кликните здесь для просмотра всего текста
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
23 / 23 / 0
Регистрация: 26.02.2014
Сообщений: 684
30.03.2017, 13:54  [ТС]
Паблито, отличный пример, но пытаюсь адаптировать его под себя и не догоняю некоторые моменты:

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
2884 / 2296 / 769
Регистрация: 12.05.2014
Сообщений: 7,978
30.03.2017, 14:06
Кликните здесь для просмотра всего текста
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
23 / 23 / 0
Регистрация: 26.02.2014
Сообщений: 684
30.03.2017, 14:18  [ТС]
Паблито,
то зачем вообще тогда таймер обратного отсчета?
магия только в том чтобы после того как по таймеру сработал "тынь-дынь" сохранялись значения времени на начало отсчета, а при последующем запуске к этим значениям будут прибавляться еще и другие, и сумма времени подставляться в tvText. как-то так...
0
2884 / 2296 / 769
Регистрация: 12.05.2014
Сообщений: 7,978
30.03.2017, 14:35
тогда что-то типа этого
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
23 / 23 / 0
Регистрация: 26.02.2014
Сообщений: 684
03.04.2017, 12:05  [ТС]
Паблито, этот вариант сбрасывает 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
03.04.2017, 12:08

Не по теме:

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

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

0
23 / 23 / 0
Регистрация: 26.02.2014
Сообщений: 684
03.04.2017, 13:28  [ТС]
Паблито,

Не по теме:

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



все заработало....
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
03.04.2017, 13:28
Помогаю со студенческими работами здесь

Как убить поток, созданный динамически
К примеру поток создаётся так: void MyMetod(int a, int b) { MessageBox.Show((a * b).ToString()); } ...

Как убить поток чужого процесса?
Всем привет! Через System.Diagnostics.GetProcesses() получаю список процессов. Свойство Threads каждого процесса содержит список потоков....

как убить поток и передать из него данные в класс формы?
здравствуйте. пользуюсь Visual Studif 2005, проект на C# под PDA. На С# пишу первый раз. Клиент-серверное приложение, нужен поток приема...

Корректно убить поток
Пусть имеется поток thrdWork, который обрабатывает большие данные. В результате этой работы в памяти каждый раз сохраняются наиболее лучшие...

убить поток + datagrid
на форме есть datagrid, каждая строка в нем создается из потока, так же из потока передается текущее состояние функции, запущенной в этом...


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

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Новые блоги и статьи
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru