Форум программистов, компьютерный форум CyberForum.ru

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

Восстановить пароль Регистрация
 
HackerNovo
0 / 0 / 0
Регистрация: 15.03.2016
Сообщений: 6
02.11.2016, 18:29     Некорректно работает таймер #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>
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.11.2016, 18:29     Некорректно работает таймер
Посмотрите здесь:

Таймер не работает Android
Android Таймер
Некорректно работает поток в Activity Android
Таймер Android
NDK некорректно загружаются данные в шейдер Android
Таймер Android
Android Некорректно выполняется запрос к SQLite
Android WebView некорректно загружает url (Android Studio)

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
shavuz
55 / 61 / 10
Регистрация: 29.01.2014
Сообщений: 299
02.11.2016, 19:40     Некорректно работает таймер #2
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Вобще то правельно делать такую штуку через сервис, когда телефон засыпает он заходит в онПауз, вот и таймер ваш перестает работать. Скорее всего если вы откроете приложение и все пол часа не дадите ему уснуть, все сработает нормально. Дальше, отображение времени не очень правельное:
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);
мемори лик, надо это делать в онрезюм , а в он пауз делать наль
Yandex
Объявления
02.11.2016, 19:40     Некорректно работает таймер
Ответ Создать тему
Опции темы

Текущее время: 22:04. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru