Зачем наблюдать триггеры MutableLiveData дважды без postValue? - PullRequest
0 голосов
/ 14 января 2020

Я хочу добавить путь к файлу в БД, и когда файл уже существует в БД, отобразить сообщение Toast. В классе ViewModel:

public void addFile(SharedFile file) {
    DefaultExecutorSupplier.getInstance().forBackgroundTasks()
            .execute(() -> {
                long result = fileRepository.insert(file);
                insertResult.postValue(result);
            }
    );
}

public MutableLiveData<Long> getInsertResult() {
    return insertResult;
}

и во фрагменте onViewCreated:

    viewModel.getInsertResult().observe(getViewLifecycleOwner(), aLong -> {
        if (aLong == -1) {
            Toast.makeText(getContext(), getString(R.string.already_exist_file), Toast.LENGTH_LONG).show();
        }
    });

Это работает, и когда я добавляю повторяющийся файл, оно выдает сообщение, но проблема заключается в том, когда я откройте другой фрагмент и вернитесь к текущему фрагменту снова. Сообщение тосты.

1 Ответ

1 голос
/ 14 января 2020

Это потому, что при (повторной) подписке на LiveData вы всегда получаете значение, которое было отправлено последним. См. здесь под Всегда актуальными данными . Некоторые способы обойти это обсуждаются здесь: Android LiveData предотвращает получение последнего значения при наблюдении

...