Форум программистов, компьютерный форум, киберфорум
Наши страницы
Программирование Android
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
HackerNovo
0 / 0 / 0
Регистрация: 15.03.2016
Сообщений: 6
1

Некорректно работает таймер

02.11.2016, 18:29. Просмотров 823. Ответов 1
Метки нет (Все метки)

Здравствуйте! Написал для себя мелкое приложение в котором есть таймер, кнопка которая его останавливает и запускает, кнопка которая добавляет 30 мин. На первый взгляд все работает нормально, но когда включаешь таймер и через полчаса проверяешь, то он уже не работает. Причем каждый раз он перестает работать через разное время. Есть предположение, что возможно приложение просто закрывается, так как андроид думает, что оно больше не нужно. Как это исправить? Код ниже:

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
package com.example.veret.doit;
 
import android.content.SharedPreferences;
import android.os.CountDownTimer;
import android.os.Handler;
import android.os.StrictMode;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
 
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
    private int time=0;
    private boolean isTimeRunning=false;
    private TextView timeView;
    SharedPreferences sPref;
    final String TIME_COUNT="time_count";
    final String MESSEGE="messege";
    CdTimer timer;
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
 
        Button startButton=(Button) findViewById(R.id.startTime);
        Button add=(Button) findViewById(R.id.do_it);
        startButton.setOnClickListener(this);
        add.setOnClickListener(this);
 
 
        sPref = getSharedPreferences("MyPref", MODE_PRIVATE);
        time = sPref.getInt(TIME_COUNT,0);
        TextView textView=(TextView) findViewById(R.id.messege);
        textView.setText(sPref.getString(MESSEGE,""));
        timeView=(TextView) findViewById(R.id.timeView);
 
        timer=new CdTimer(time*1000,1000);
 
        int hour=time/3600;
        int min=(time/60)%60;
        int sec=time%60;
        String timeStr = String.format("%d:%02d:%02d", hour, min, sec);
        timeView.setText(timeStr);
    }
 
    public void onMessClick(View v){
        EditText editText=(EditText) findViewById(R.id.edit_text);
        TextView textView=(TextView) findViewById(R.id.messege);
        String mes= String.valueOf(editText.getText());
        textView.setText(mes);
        sPref = getSharedPreferences("MyPref", MODE_PRIVATE);
        SharedPreferences.Editor ed = sPref.edit();
        ed.putString(MESSEGE,mes);
        ed.commit();
        editText.setText("");
    }
    @Override
    public void onClick(View v) {
        switch (v.getId()){
            case R.id.startTime:
                Button startButton=(Button) findViewById(R.id.startTime);
                if (isTimeRunning) {
                    isTimeRunning = false;
                    timer.cancel();
                    startButton.setText("Начать страдать фигней");
                }
                else {
                    isTimeRunning = true;
                    timer.start();
                    startButton.setText("Я молодец!");
                }
                break;
            case R.id.do_it:
                time+=30*60;
                break;
        }
    }
 
    @Override
    protected void onDestroy() {
        super.onDestroy();
        sPref = getSharedPreferences("MyPref", MODE_PRIVATE);
        SharedPreferences.Editor ed = sPref.edit();
        ed.putInt(TIME_COUNT,time);
        ed.commit();
    }
 
    public class CdTimer extends CountDownTimer {
        public CdTimer(long millisInFuture, long countDownInterval) {
            super(millisInFuture, countDownInterval);
        }
 
        @Override
        public void onTick(long millisUntilFinished) {
            time--;
            if(time<=0)
                time=0;
            int hour=time/3600;
            int min=(time/60)%60;
            int sec=time%60;
            String timeStr = String.format("%d:%02d:%02d", hour, min, sec);
            timeView.setText(timeStr);
 
        }
 
        @Override
        public void onFinish() {
 
        }
    }
   
}
XML
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
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/activity_main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    android:orientation="vertical"
    tools:context="com.example.veret.doit.MainActivity">
 
    <TextView
        android:id="@+id/timeView"
        android:text="00:00:00"
        android:textSize="70dp"
        android:gravity="center"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />
 
    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Начать страдать фигней"
        android:id="@+id/startTime"/>
 
 
    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Я прошел параграф!"
        android:id="@+id/do_it"/>
    <TextView
        android:id="@+id/messege"
        android:layout_weight="1"
        android:textSize="30dp"
        android:gravity="center"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />
    <LinearLayout
        android:orientation="horizontal"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">
        <EditText
            android:id="@+id/edit_text"
            android:layout_weight="1"
            android:layout_width="wrap_content"
            android:layout_height="match_parent" />
        <Button
            android:id="@+id/BtnMes"
            android:onClick="onMessClick"
            android:text="Да!"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />
    </LinearLayout>
</LinearLayout>
0
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.11.2016, 18:29
Ответы с готовыми решениями:

Некорректно работает поток в Activity
Что неправильно в данном коде? Когда я начинаю вводить текст в EditText,...

ExpandableListView адаптер некорректно работает
Здравствуйте, помогите найти ошибку. Адаптер не распределяет объекты по своим...

RecyclerView - некорректно работает клик по изображению
Здравствуйте уважаемые форумчане! Имеется RecyclerView, там загружаются...

Таймер не работает
сколько не пытался сделать таймер на androide приложение у меня всегда...

Fragment некорректно работает при повороте устройства
При выводе на экран фрагмента после поворота устройства получаю такую ошибку: ...

1
shavuz
114 / 120 / 26
Регистрация: 29.01.2014
Сообщений: 596
02.11.2016, 19:40 2
Лучший ответ Сообщение было отмечено HackerNovo как решение

Решение

Вобще то правельно делать такую штуку через сервис, когда телефон засыпает он заходит в онПауз, вот и таймер ваш перестает работать. Скорее всего если вы откроете приложение и все пол часа не дадите ему уснуть, все сработает нормально. Дальше, отображение времени не очень правельное:
Java
1
2
3
4
if(time<=0)
                time=0;
            int hour=time/3600;
            int min=(time/60)%60;
тайм это инт, вы его делите, т.е например если тайм = 149 и вы разделите его на 60 результат будет 2, но на самом деле то это практически 2.5 значит не правельно показываете время. нужно просто перевести миллисекунды в время, примерно это делается так:
Java
1
2
3
4
5
String.format("%d min, %d sec", 
    TimeUnit.MILLISECONDS.toMinutes(millis),
    TimeUnit.MILLISECONDS.toSeconds(millis) - 
    TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toMinutes(millis))
);
этот стринг и вставляйте в текствью

а, и последнее это:
Java
1
2
   startButton.setOnClickListener(this);
        add.setOnClickListener(this);
мемори лик, надо это делать в онрезюм , а в он пауз делать наль
1
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.11.2016, 19:40

Некорректно выполняется запрос к SQLite
Здравствуйте! Необходимо сделать выборку данных из БД по двум условиям + еще...

NDK некорректно загружаются данные в шейдер
Здравствуйте! Имеется java-функция, которая прекрасно работает private void...

Webview Веб браузер отображает некорректно страницы
Прощу прощение если тема не в теме и такое уже== правда искал не нашел Сразу...


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

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

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