According to LiveData documentation:
The LiveData class provides the following advantages:
...
Always up to date data: If a Li
I`m not sure if it will work in your case, but in my case (increasing/decreasing items amount in Room by click on views) removing Observer and checking if there is active observers let me do the job:
LiveData<MenuItem> menuitem = mViewModel.getMenuItemById(menuid);
menuitem.observe(this, (MenuItem menuItemRoom) ->{
                menuitem.removeObservers(this);
                if(menuitem.hasObservers())return;
                // Do your single job here
                });
});  
UPDATE 20/03/2019:
Now i prefer this: EventWraper class from Google Samples inside MutableLiveData
/**
 * Used as a wrapper for data that is exposed via a LiveData that represents an event.
 */
public class Event<T> {
    private T mContent;
    private boolean hasBeenHandled = false;
    public Event( T content) {
        if (content == null) {
            throw new IllegalArgumentException("null values in Event are not allowed.");
        }
        mContent = content;
    }
    @Nullable
    public T getContentIfNotHandled() {
        if (hasBeenHandled) {
            return null;
        } else {
            hasBeenHandled = true;
            return mContent;
        }
    }
    public boolean hasBeenHandled() {
        return hasBeenHandled;
    }
}
In ViewModel :
 /** expose Save LiveData Event */
 public void newSaveEvent() {
    saveEvent.setValue(new Event<>(true));
 }
 private final MutableLiveData<Event<Boolean>> saveEvent = new MutableLiveData<>();
 LiveData<Event<Boolean>> onSaveEvent() {
    return saveEvent;
 }
In Activity/Fragment
mViewModel
    .onSaveEvent()
    .observe(
        getViewLifecycleOwner(),
        booleanEvent -> {
          if (booleanEvent != null)
            final Boolean shouldSave = booleanEvent.getContentIfNotHandled();
            if (shouldSave != null && shouldSave) saveData();
          }
        });