代码之家  ›  专栏  ›  技术社区  ›  jonny

保存在SharedReference中的Countdowntimer显示错误的计时器

  •  0
  • jonny  · 技术社区  · 6 年前

    我有一个倒计时计时器,它需要一个长的as参数,然后它会显示该时间的倒计时。当我单击backbutton并退出应用程序时,我希望倒计时计时器的剩余时间保存在onStop()方法中的sharepreference中。当我重新打开应用程序时,我想将剩余时间作为参数,再次启动计时器,直到它达到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();
    
    
    }
    

    我想做的是,当倒计时计时器运行,我离开应用程序时,我正在使用系统。currenttimeinmillis+倒计时计时器的剩余时间。这就是变量s+tt。 然后我将timee等于s+tt系统的剩余时间。currenttimeinmillis,要有倒计时计时器,请倒计时剩余时间,包括关闭/停止应用程序的时间。 然后我调用startTimer()方法;使用我的新参数timee。但它不会显示剩余时间,而是在退出并进入应用程序时显示与我输入的时间相同的时间。

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

    1 回复  |  直到 6 年前
        1
  •  0
  •   Szamot    6 年前

    首先,当您得到倒计时的值时,在按下开始按钮[或您用来调用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();
    }
    

    更改桌面()

    @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();
        }
    }