Наблюдение за другими ViewModel из ViewModel - PullRequest
1 голос
/ 12 марта 2020

Я работаю над приложением типа POS и пытаюсь найти лучший способ обработки, показывающий общее количество элементов, выбранных пользователем. Для простоты предположим, что пользователь может либо выбрать элемент, либо отменить его выбор (у него не может быть кратных элемента). Это то, что я рассматривал, но я не уверен, что это правильный путь:

Модель

public class Item {
    public String name;
    public double cost;
}

Item ViewModel

public class ItemViewModel {
    private Item model;
    private MutableLiveData<Boolean> isSelected;

    public ItemViewModel(Item model){
        this.model = model;
        this.isSelected = new MutableLiveData<>(false);
    }

    //...isSelected getter and code to handle selection...//
}

Main ViewModel

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);
    }
}

В частности, можно ли наблюдать за другой ViewModel? Я рискую утечками памяти, делая это? Это неправильный способ решения этой проблемы?

1 Ответ

0 голосов
/ 12 марта 2020

Я не знаю, есть ли что-то в корне "неправильное", когда виртуальная машина наблюдает за другой виртуальной машиной. Но я предлагаю внимательно взглянуть на эту строку кода:

vm.getIsSelected().observerForever(this::onSelectionChanged);

observeForever, вероятно, не то, что вы хотите сделать, поскольку оно не соответствует жизненному циклу виртуальной машины. Android ВМ имеет жизненный цикл (внимательно прочитайте эти документы), который соответствует компоненту (андроид / фрагмент), который его использует, и эта ВМ будет продолжать получать обновления после уничтожения этого компонента. Мне это кажется утонченным.

Вероятно, для виртуальной машины лучше выставить внутренние виртуальные машины непосредственно для действия / фрагмента для непосредственного использования в соответствии с их собственными жизненными циклами.

Ваша виртуальная машина также должна быть подклассом ViewModel .

...