Java 奇怪的LiveData行为?

Java 奇怪的LiveData行为?,java,android,mvvm,viewmodel,android-livedata,Java,Android,Mvvm,Viewmodel,Android Livedata,我正在尝试使用ViewModel和LiveData实现MVVM体系结构。这两种方法位于活动中: private void handleResult(BoardViewModel vm) { vm.getLiveDataSingleObj("Result").observe(this, new Observer<Object>() { @Override public void onChanged(@Nullable O

我正在尝试使用ViewModel和LiveData实现MVVM体系结构。这两种方法位于活动中:

 private void handleResult(BoardViewModel vm) {
        vm.getLiveDataSingleObj("Result").observe(this, new Observer<Object>() {
            @Override
            public void onChanged(@Nullable Object resultObj) {
                Result result = (Result) resultObj;
                if (!result.isCompleted()) return;
                gotoResult();
            }
        });
    }
handleResult方法设置为侦听结果对象,这些对象指示游戏已结束,是时候进入下一个活动(“gotoResult”)。然而,这完全破坏了应用程序的导航功能,当我返回并说尝试开始一个新的游戏会话时,我立即转到下一个活动,告诉我我已经赢了

任何关于它为何多次触发并最终停止的想法,让我开始一个新的会话。要澄清的是,如果我每次都删除gotoResult,那么逻辑就会工作,没有索引超出范围的错误,或者其他什么,只有当我添加goto时,一切都会中断

视图模型:

private void setupHashTypes() {
        hashLiveData.put(KEY_BOARD, liveDataBoardQuery);
        hashLiveData.put(KEY_STEPS_COUNTER, game.getStepsTakenLiveData());
        hashLiveData.put(KEY_PATH_CHANGE, game.getPathChangedLiveData());
        hashLiveData.put(KEY_VALUE_CHANGE, game.getValueChangeLiveData());
        hashLiveData.put(KEY_TIMER, game.getTimerLiveData());
        hashLiveData.put(KEY_SELECTED, game.getSelectedLiveData());
        hashLiveData.put(KEY_DESELECTED, game.getDeselectedLiveData());
        hashLiveData.put(KEY_HOLD, game.getHoldLiveData());
        hashLiveData.put(KEY_UNHOLD, game.getUnholdLiveData());
        hashLiveData.put(KEY_RESULT, game.getResultLiveData());
    }

    public LiveData<Object> getLiveDataSingleObj(String type) {
        if (hashLiveData.containsKey(type)) {
            return (LiveData<Object>) hashLiveData.get(type);
        }
        throw new IllegalArgumentException("Invalid: key was not found: " + type);
    }
private void setupHashTypes(){
hashLiveData.put(键盘,liveDataBoardQuery);
hashLiveData.put(KEY_STEPS_COUNTER,game.getStepsTakenLiveData());
hashLiveData.put(KEY_PATH_CHANGE,game.getPathChangedLiveData());
hashLiveData.put(KEY\u VALUE\u CHANGE,game.getValueChangeLiveData());
hashLiveData.put(KEY_TIMER,game.getTimerLiveData());
hashLiveData.put(KEY_SELECTED,game.getSelectedLiveData());
hashLiveData.put(KEY_已取消选择,game.getDecelectedLiveData());
hashLiveData.put(KEY_HOLD,game.getHoldLiveData());
hashLiveData.put(KEY_UNHOLD,game.getUnholdLiveData());
hashLiveData.put(KEY_RESULT,game.getResultLiveData());
}
公共LiveData getLiveDataSingleObj(字符串类型){
if(hashLiveData.containsKey(类型)){
return(LiveData)hashLiveData.get(type);
}
抛出新的IllegalArgumentException(“无效:找不到键:“+type”);
}
该模型具有getter,例如:

  private final SingleLiveEvent<Result> resultLiveData = new SingleLiveEvent<>();
    public LiveData<Result> getResultLiveData() {
        return resultLiveData;
    }
private final SingleLiveEvent resultLiveData=new SingleLiveEvent();
公共LiveData getResultLiveData(){
返回resultLiveData;
}

您应该删除
ondestory()
方法中的观察者

您应该删除
ondestory()方法中的观察者
方法中的观察者

将始终将以前设置的值重新发送给新订阅者的可变LiveData更改为不具有此行为的SingleLiveEvent,解决了问题


可以在此处找到该类:

将始终将以前的设置值重新发送给新订阅者的MutableLiveData更改为不具有此行为的SingleLiveEvent,解决了该问题


可以在此处找到该类:

您的解决方案可能有效。我理解的问题是,LiveData的一种行为是,它向每个新的观察者发送最新的值。因此,当我开始第二个游戏会话时,它会收到传输的最新结果,立即结束游戏会话。另一个解决方案是使用名为SingleLiveEvent的东西,我已经知道了如何做,但只将新数据传递给观察者,而不是最新的推送数据。如果未重置livedata的状态,在onStart方法中,最新的值将被重新传递。您的解决方案可能会起作用。我理解的问题是,LiveData的一种行为是,它向每个新的观察者发送最新的值。因此,当我开始第二个游戏会话时,它会收到传输的最新结果,立即结束游戏会话。另一种解决方案是使用一种叫做SingleLiveEvent的东西,我已经知道了怎么做,但是只向观察者传递新数据,而不是最新的推送数据。如果livedata的状态没有重置,在onStart方法中,最新的值将被重新传递。请显示发出对象完成状态的viewModel代码i添加了viewModel和模型的一些部分,尽管问题已经解决。请显示发出对象完成状态的viewModel代码i添加了viewModel和模型的一些部分,虽然问题已经解决了。
  private final SingleLiveEvent<Result> resultLiveData = new SingleLiveEvent<>();
    public LiveData<Result> getResultLiveData() {
        return resultLiveData;
    }