2017-02-02 4 views
0

Добрый день! Я пытаюсь сделать таймер обратного отсчета до даты, но у меня есть следующая проблема: когда я устанавливаю дату и время - это нормально, но когда я пытаюсь сбросить таймер, а затем перезагрузить приложение, я все еще видел предыдущий обратный отсчет таймера. Я уже пробовал все, что я могу даже сделать.Невозможно остановить 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 ... но Я все еще не могу найти решение.

После нескольких часов я заметил еще один образец: если установить время, сбросьте таймер и перезапустите приложение - все будет работать так, как должно. Но если установить время, перезапустите его, а затем сбросьте таймер - после следующего запуска приложения он снова начнет обратный отсчет.

+0

Можете ли вы пост 'заново();' метод? –

+0

Что такое класс TimerPreference? –

+0

@SanjayKakadiya «recreate()» - это стандартный андроидный метод, который перезагружает активность –

ответ

0

Добавить timerPreference.setTime(0); после timerPreference.clearPreferences(); в cancelTimer() способ.

+0

Я уже пробовал этот «timerPreference.setTime (0L);», но это не поможет. –

+0

К сожалению, это все та же проблема. Я зарегистрировал код, используя String.valueOf (timerPreference.getTime()), и получаю это, когда я нажимаю reset, я получаю «TIME-IN-cancelTimer: 0», эта активность перезагружается функцией onrecreate(); и я получаю «TIME-IN-onCreate: 0», но затем, когда я закрываю приложение и снова открываю - получаю «TIME-IN-onCreate: 47025952» –

0

Попробуйте использовать editor.commit(); в clearPreferences() методом TimerPreference класса

+0

Нет ... все тот же результат –

+0

Mmm, use commit() также в методе setTime(). –

+0

Nope (A заметил, что настройки очищаются, только когда я убиваю приложение –