2017-02-02 78 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();」在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

clearPreferences()方法,你可以發佈'重新創建();'方法? –

+0

這裏是什麼'TimerPreference'類? –

+0

@SanjayKakadiya「recreate()」是重載活動的非標準安卓方法 –

回答

0

添加timerPreference.setTime(0);timerPreference.clearPreferences();cancelTimer()方法。

+0

我已經試過這個「timerPreference.setTime(0L);」,但它不會幫助。 –

+0

不幸的是它仍然是一個問題。我使用String.valueOf(timerPreference.getTime())記錄代碼,並獲得當我按下重置時,我得到「TIME-IN-cancelTimer:0」,該活動由onrecreate()重新加載;我得到了「TIME-IN-onCreate:0」,但是當我關閉應用程序並再次打開時 - 我得到「TIME-IN-onCreate:47025952」 –

0

嘗試使用editor.commit();TimerPreference

+0

沒有...仍然是相同的結果 –

+0

嗯,使用commit()也在setTime()方法中。 –

+0

沒有(注意到首選項清除,只有當我殺了應用程序 –