我用的是一个计时器,它需要持续运行直到停止。
我在下面使用的代码运行良好,计时表一直在运行,但是,当设备重新启动时,我得到负值。
SharedPreferences sharedPreferences = getSharedPreferences("chronometer", MODE_PRIVATE);
//Check if the start time was saved before
long elapsedTime = sharedPreferences.getLong("elapsed_time", 0);
if (elapsedTime != 0) {
//It means the chronometer was running before, so we set the time from SharedPreferences
chronometer.setBase(elapsedTime);
chronometer.start();
}
//Code below starts the chronometer, after the user manually starts it
Button startButton = findViewById(R.id.btnStart);
startButton.setOnClickListener(v -> {
//Save the starting time
long elapsedRealtime = SystemClock.elapsedRealtime();
sharedPreferences.edit().putLong("elapsed_time", elapsedRealtime).apply();
chronometer.setBase(SystemClock.elapsedRealtime());
chronometer.start();
});
为什么在重新启动后计时器显示负值&我该如何处理它?
2条答案
按热度按时间fzwojiic1#
你应该把钱存起来
elapsedMillis
进入共享首选项,当设备重新启动并设置计时表的底座时,您应该执行以下操作哪里
millis
是首选项中的值gywdnpxw2#
来自android文档
计时器
实现简单计时器的类。
你可以在系统时钟elapsedrealtime时基中给它一个开始时间,然后从这个时间开始计算。
此类的时基基于systemclock.elapsedrealtime()。
延时
public static long elapsedRealtime()
返回启动后的毫秒数,包括睡眠时间。回到你的问题上来:
为什么重新启动后,计时器显示负值?
下面是一个示例来演示这个场景。
假设您的手机在上次启动后大约10分钟内运行,此时用户打开活动
elapsedRealtime()
方法将返回600000l(10分钟=10601000毫秒)。当用户单击开始按钮时,您可以将计时器的时间设置为基准时间,并使用将600000升保存到sharepreferenceselapsed_time
钥匙。马上:
elapsedRealTime()
=10分钟|计时器=00:001分钟后:
elapsedRealtime()
=11分钟|计时器=01:0010分钟后:
elapsedRealTime()
=20分钟|计时器=10:00此时用户按后退键退出应用程序并重新启动手机。
手机有点慢,所以开机需要2分钟。用户再次打开活动。在这个时候。
elapsedRealtime()
返回120000l(2分钟=2601000毫秒)保存在sharepreferences中的值(
elapsed_time
)是600000升因为你设定的计时表的基准时间比
elapsedRealtime()
,因此计时表将显示-08:00并从该值开始计数。我该怎么处理呢?
您可以保存计时器的运行时间以及从上次用户离开活动到下次用户打开活动的运行时间。然后用这两个值来计算天文钟的基准时间。
活动\u main.xml
主活动.java