Добрый день! Я пытаюсь сделать таймер обратного отсчета до даты, но у меня есть следующая проблема: когда я устанавливаю дату и время - это нормально, но когда я пытаюсь сбросить таймер, а затем перезагрузить приложение, я все еще видел предыдущий обратный отсчет таймера. Я уже пробовал все, что я могу даже сделать.Невозможно остановить CountDownTimer
public class MainActivity extends AppCompatActivity {
TextView tv_days;
TextView tv_hours;
TextView tv_minutes;
TextView tv_seconds;
TextView tv_msg;
ImageButton btnTimer;
ImageButton btnExit;
long total_millisec;
CountDownTimer cdt;
TimerPreference timerPreference;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tv_days = (TextView) findViewById(R.id.days);
tv_hours = (TextView) findViewById(R.id.hours);
tv_minutes = (TextView) findViewById(R.id.minutes);
tv_seconds = (TextView) findViewById(R.id.seconds);
tv_msg = (TextView) findViewById(R.id.msg);
btnTimer = (ImageButton) findViewById(R.id.setTimer);
btnExit = (ImageButton) findViewById(R.id.resetTimer);
final Intent setTimer = new Intent(this, ShowActivity.class);
timerPreference = new TimerPreference(this);
total_millisec = timerPreference.getTime();
if(total_millisec != 0){
setTime();
}
View.OnClickListener mainWin = new View.OnClickListener() {
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.setTimer:
startActivity(setTimer);
break;
case R.id.resetTimer:
resetTimer();
break;
}
}
};
btnTimer.setOnClickListener(mainWin);
btnExit.setOnClickListener(mainWin);
}
public void setTime() {
cdt = new CountDownTimer(total_millisec, 1000) {
@Override
public void onTick(long millisUntilFinished) {
timerPreference.setTime(millisUntilFinished);
long days = TimeUnit.MILLISECONDS.toDays(millisUntilFinished);
millisUntilFinished -= TimeUnit.DAYS.toMillis(days);
long hours = TimeUnit.MILLISECONDS.toHours(millisUntilFinished);
millisUntilFinished -= TimeUnit.HOURS.toMillis(hours);
long minutes = TimeUnit.MILLISECONDS.toMinutes(millisUntilFinished);
millisUntilFinished -= TimeUnit.MINUTES.toMillis(minutes);
long seconds = TimeUnit.MILLISECONDS.toSeconds(millisUntilFinished);
setScreenData(String.valueOf(days),
String.valueOf(hours),
String.valueOf(minutes),
String.valueOf(seconds));
}
@Override
public void onFinish() {
Log.e("TIMER:"," FINISH!");
}
};
cdt.start();
}
public void setScreenData(String setD, String setH,String setM, String setS){
tv_days.setText(setD);
tv_hours.setText(setH);
tv_minutes.setText(setM);
tv_seconds.setText(setS);
tv_msg.setText("");
}
private void resetTimer(){
AlertDialog.Builder quitDialog = new AlertDialog.Builder(this);
quitDialog.setTitle("Reset Timer?");
quitDialog.setNegativeButton("No", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
}
});
quitDialog.setPositiveButton("Yes", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
cancelTimer();
recreate();
}
});
quitDialog.show();
}
void cancelTimer() {
if(cdt!=null) {
cdt.cancel();
}
timerPreference.clearPreferences();
}
}
я зарегистрировал этот код на несколько часов, и я заметил, что даже после того, как я отменить таймер, четкие предпочтения и перезагрузить приложение, «total_millisec = timerPreference.getTime();» in onCreate все еще имеет информацию о времени ... Заранее благодарю за любой ответ.
UDP:
TimerPreference.java
class TimerPreference {
private SharedPreferences prefs;
TimerPreference(Context context){
prefs = context.getSharedPreferences("Timer",Context.MODE_PRIVATE);
}
void setTime(Long time){
prefs.edit().putLong("time", time).apply();
}
Long getTime(){
return prefs.getLong("time", 0);
}
void clearPreferences(){
SharedPreferences.Editor editor = prefs.edit();
editor.clear();
editor.apply();
}
}
UPD2: Я вошел код, используя String.valueOf (timerPreference.getTime()) и получить что когда я нажимаю reset, я получаю «TIME-IN-cancelTimer: 0», чем активность, перезагруженная функцией onrecreate(); и я получаю «TIME-IN-onCreate: 0», но когда я закрываю приложение и снова открываю - я получаю «TIME-IN-onCreate: 47025952», поэтому теперь я уверен, что проблема в классе TimerPreference ... но Я все еще не могу найти решение.
После нескольких часов я заметил еще один образец: если установить время, сбросьте таймер и перезапустите приложение - все будет работать так, как должно. Но если установить время, перезапустите его, а затем сбросьте таймер - после следующего запуска приложения он снова начнет обратный отсчет.
Можете ли вы пост 'заново();' метод? –
Что такое класс TimerPreference? –
@SanjayKakadiya «recreate()» - это стандартный андроидный метод, который перезагружает активность –