Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/195.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 从ViewModel观察其他ViewModel_Android_Android Livedata_Android Viewmodel - Fatal编程技术网

Android 从ViewModel观察其他ViewModel

Android 从ViewModel观察其他ViewModel,android,android-livedata,android-viewmodel,Android,Android Livedata,Android Viewmodel,我正在开发一个POS类型的应用程序,我试图找出最好的方式来处理显示用户选择的项目总数。为了简单起见,假设用户可以选择一个项目或取消选择它(他们不能有多个项目)。这是我正在考虑的,但我不确定这是否正确: 模型 项目视图模型 公共类ItemViewModel{ 私人物品模型; 选择私有可变LiveData; 公共项目视图模型(项目模型){ this.model=模型; this.isSelected=新的可变LiveData(false); } //…我选择了getter和代码来处理选择// }

我正在开发一个POS类型的应用程序,我试图找出最好的方式来处理显示用户选择的项目总数。为了简单起见,假设用户可以选择一个项目或取消选择它(他们不能有多个项目)。这是我正在考虑的,但我不确定这是否正确:

模型

项目视图模型

公共类ItemViewModel{
私人物品模型;
选择私有可变LiveData;
公共项目视图模型(项目模型){
this.model=模型;
this.isSelected=新的可变LiveData(false);
}
//…我选择了getter和代码来处理选择//
}
主视图模型

public类主视图模型{
私有最终可变LiveData项;
私有最终可变LiveData总成本;
公共主视图模型(列表项){
List viewModels=new ArrayList();
用于(项目:项目){
ItemViewModel vm=新的ItemViewModel(项目);
vm.getIsSelected().observerForever(this::onSelectionChanged);
viewModels.add(vm);
}
this.items=新的可变LiveData(viewModels);
this.totalCost=新的可变LiveData(0.00d);
}   
私有void onSelectionChanged(布尔值){
双倍总计=0.00d;
//…总计所有选定项目//
此值为.totalCost.postValue(总计);
}
}

具体来说,观察另一个ViewModel可以吗?我这样做是否有内存泄漏的风险?这是处理此类问题的错误方法吗?

我不知道一个虚拟机观察另一个虚拟机是否有任何根本的“错误”。但我建议仔细看看这一行代码:

vm.getIsSelected().observerForever(this::onSelectionChanged);
observeforver
可能不是您想要做的,因为它不尊重虚拟机的生命周期。一个Android虚拟机(仔细阅读这些文档),它与使用它的组件(Android/fragment)匹配,并且这个虚拟机将在该组件被销毁后继续接收更新。对我来说这听起来有点漏洞百出

对于VM来说,根据其自身的生命周期,最好将内部VM直接暴露给要直接使用的活动/片段


你的虚拟机也应该子类化。

我不知道一个虚拟机观察另一个虚拟机是否有什么根本的“错误”。但我建议仔细看看这一行代码:

vm.getIsSelected().observerForever(this::onSelectionChanged);
observeforver
可能不是您想要做的,因为它不尊重虚拟机的生命周期。一个Android虚拟机(仔细阅读这些文档),它与使用它的组件(Android/fragment)匹配,并且这个虚拟机将在该组件被销毁后继续接收更新。对我来说这听起来有点漏洞百出

对于VM来说,根据其自身的生命周期,最好将内部VM直接暴露给要直接使用的活动/片段

你的虚拟机也应该是子类

public class MainViewModel {
    private final MutableLiveData<List<ItemViewModel>> items;
    private final MutableLiveData<Double> totalCost;

    public MainViewModel(List<Item> items){
        List<ItemViewModel> viewModels = new ArrayList<>();

        for(Item item : items) {
            ItemViewModel vm = new ItemViewModel(item);
            vm.getIsSelected().observerForever(this::onSelectionChanged);
            viewModels.add(vm);
        }

        this.items = new MutableLiveData<>(viewModels);
        this.totalCost = new MutableLiveData<>(0.00d);
    }   

    private void onSelectionChanged(Boolean value){
        double total = 0.00d;
        //...total all selected items...//
        this.totalCost.postValue(total);
    }
}
vm.getIsSelected().observerForever(this::onSelectionChanged);