Форум программистов, компьютерный форум, киберфорум
Программирование Android
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/9: Рейтинг темы: голосов - 9, средняя оценка - 4.67
0 / 0 / 0
Регистрация: 15.03.2016
Сообщений: 6
1

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

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

Author24 — интернет-сервис помощи студентам
Здравствуйте! Написал для себя мелкое приложение в котором есть таймер, кнопка которая его останавливает и запускает, кнопка которая добавляет 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)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
02.11.2016, 18:29
Ответы с готовыми решениями:

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

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

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

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

1
114 / 120 / 26
Регистрация: 29.01.2014
Сообщений: 609
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
02.11.2016, 19:40
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
02.11.2016, 19:40
Помогаю со студенческими работами здесь

Нативный код некорректно работает в Android Studio
Пишу простенький менеджер с шифрованием сообщений. Сам мессенджер написан на Java, а шифрующий...

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

Некорректно работает if
Здравствуйте. У меня проблема. Если я указываю такое условие: if ( (i != k) &amp;&amp; (j != l) ) то if...

Некорректно работает
Здравствуйте помогите пож-та с задачкой: Сформировать вещественный массив X1(N), N≤20,...


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

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru