我正在尝试编写一个计时器来跟踪我在不同活动上花费的时间。我想使用MVVM体系结构来做到这一点。因此,我在ViewModel中创建一个计时器,然后通过View中的LiveData对其进行观察。一切正常,直到我尝试从共享的首选项恢复数据。要检查我关闭活动时计时器是否正在运行,我使用了保存在ViewModel中共享首选项的boolean isRunning。它可以很好地保存和恢复,但是在创建View中的观察者时,它将其值更改为true。
我检查了观察者是否将所有布尔值都设置为true。但是不可以,只有负责计时器的布尔值会更改。我不知道为什么会这样。
我在ViewModel构造函数中创建共享的首选项:
public TimerViewModel(@NonNull Application application) {
super(application);
repository = new Repository(application);
sharedPreferences = application.getSharedPreferences("com.shaary.a10000hours", Context.MODE_PRIVATE);
isRunning = false;
}
在视图中按下“开始”按钮时将创建计时器:
public void startTimer() {
isRunning = true;
mInitialTime = SystemClock.elapsedRealtime();
timer = new Timer();
// Update the elapsed time every second.
timer.scheduleAtFixedRate(new TimerTask() {
@Override
public void run() {
final long newValue = (SystemClock.elapsedRealtime() - mInitialTime) / ONE_SECOND;
// setValue() cannot be called from a background thread so post to main thread.
mElapsedTime.postValue(newValue);
}
}, ONE_SECOND, ONE_SECOND);
}
这就是我从共享首选项设置和检索信息的方式:
public void sharedPrefSave() {
SharedPreferences.Editor editor = sharedPreferences.edit();
editor.clear();
editor.putBoolean("is running", isRunning);
if (isRunning) {
editor.putLong("initial time", mInitialTime);
}
editor.apply();
}
public void retrievePrefs() {
mInitialTime = sharedPreferences.getLong("initial time", 0);
isRunning = sharedPreferences.getBoolean("is running", false);
Log.d(TAG, "retrievePrefs: is running " + isRunning);
}
这是视图中的观察者:
final Observer<Long> elapsedTimeObserver = new Observer<Long>() {
@Override
public void onChanged(@Nullable final Long aLong) {
String newText = viewModel.timeFormat(aLong);
timerView.setText(newText);
}
};
如果我在创建elapsedTimeObserver之前使用retrievePrefs(),那么即使在首次启动计时器调试器时,也会向我显示变量isRunning设置为true,并且它在创建elapsedTimeObserver之后发生。我不希望它更改变量。 谢谢您的提前帮助。