保存在共享首选项中的倒数计时器显示错误的计时器

时间:2018-04-16 22:34:50

标签: java android sharedpreferences countdowntimer

我有一个倒数计时器,它接受一个长参数,然后显示该时间的倒计时。当我点击后退按钮并退出应用程序时,我希望倒数计时器的剩余时间保存在onStop()方法的共享偏好中。当我重新打开应用程序时,我想将剩余时间作为参数并再次启动计时器,直到它达到0。

我遇到了麻烦,因为如果我的参数是2,那么倒数计时器会从1分59秒开始倒计时。当我退出应用程序并重新打开应用程序时,它仍然显示1分钟和59秒。倒数计时器不会减去剩余的时间。它只显示输入的时间。

private void startTimer() {
    countDownTimer = new CountDownTimer(timee*60000 , 1000) {
        @Override
        public void onTick(long l) {

            tv.setText(simpleDateFormat.format(l));

            timesLeft = l;

        }

        @Override
        public void onFinish() {
            tv.setText("00:00:00");}
}.start();

这是onStop()和onStart();

protected void onStart() {
    super.onStart();
    SharedPreferences sPrefs = getSharedPreferences("sharedPreferences", MODE_PRIVATE);


    if(1>0){

    long s = sPrefs.getLong("sysstoptime", 0);
    long tt = sPrefs.getLong("timeleft", 0);
    long currenttime = System.currentTimeMillis();
    long k = sPrefs.getLong("timeset", 0);


    s = s+tt;

    timee = (s-currenttime)/60000+1;


    startTimer();}

    else {
        Toast t5 = Toast.makeText(this, "less than or equal 0", Toast.LENGTH_LONG);
        t5.show();
    }

}

@Override
protected void onStop() {
    super.onStop();


    SharedPreferences sPrefs = getSharedPreferences("sharedPreferences", MODE_PRIVATE);
    SharedPreferences.Editor editor = sPrefs.edit();

    editor.putLong("sysstoptime", System.currentTimeMillis());
    editor.putLong("timeleft", timesLeft);
    editor.putLong("timeset", timeset);




    editor.apply();


}

我想要做的是当倒数计时器正在运行并且我要离开应用程序时,我正在使用System.currenttimeinmillis +倒数计时器的剩余时间。那是变量s + tt。 然后我等到s + tt的剩余时间--System.currenttimeinmillis,有倒数计时器,倒计时剩下的剩余时间,包括应用程序关闭/停止的时间。 然后我调用方法startTimer();用我的新参数timee。但它并没有显示剩余时间,而是显示我退出并进入应用程序时输入的相同时间。

timee是长变量,用户选择时间,以分钟为单位。因此,如果timee = 10,则表示10分钟,倒数计时器将从09:59开始计算

1 个答案:

答案 0 :(得分:0)

首先,当您获得倒计时的价值时,按下开始按钮[或用于调用startTimer()的任何内容后,将其乘以60000。

button.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
       timee = YOUR_VALUE_TO_COUNTDOWN * 60000;
       startTimer();
    }
});

改变startTimer():

    private void startTimer() {
    countDownTimer = new CountDownTimer(timee, 1000) {
        @Override
        public void onTick(long l) {
            tv.setText(simpleDateFormat.format(l));
            timesLeft = l;
        }

        @Override
        public void onFinish() {
            tv.setText("00:00:00");
        }
    }.start();
}

更改onStop()

@Override
protected void onStop() {
    super.onStop();

    SharedPreferences sPrefs = getSharedPreferences("sharedPreferences", MODE_PRIVATE);
    SharedPreferences.Editor editor = sPrefs.edit();
    editor.putLong("timeleft", timesLeft);
    editor.putLong("sysstoptime", System.currentTimeMillis());
    editor.apply();
}

最后是onStart()

@Override
protected void onStart() {
    super.onStart();
    SharedPreferences sPrefs = getSharedPreferences("sharedPreferences", MODE_PRIVATE);

    if(1>0){            
        timesLeft = sPrefs.getLong("timeleft", 0);
        long stopTime = sPrefs.getLong("sysstoptime", 0);
        long currentTime = System.currentTimeMillis();
        timee = timesLeft - (currentTime - stopTime);
        startTimer();
    }
    else {
        Toast t5 = Toast.makeText(this, "less than or equal 0", Toast.LENGTH_LONG);
        t5.show();
    }
}