为什么使用共享首选项时,LiveData观察器会将布尔变量设置为“ true”?

时间:2019-05-29 17:08:05

标签: java android android-livedata

我正在尝试编写一个计时器来跟踪我在不同活动上花费的时间。我想使用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之后发生。我不希望它更改变量。 谢谢您的提前帮助。

0 个答案:

没有答案