助手类中的计算问题-在计算之前点击返回

时间:2019-03-31 14:55:08

标签: java android android-livedata android-jetpack

我当前的问题是我想创建一个计算我的成本(存储在数据库中)的Helper类,以便使一切组织得更好(因为我需要在两个Activity中进行此计算)。

现在,计算代码(工作正常)只是写在两个活动中(这使所有事情都变得很丑陋)。

所以:我创建了一个“ CostIntervalHelper”类。

我将代码放在这里并进行了一些更改,但现在遇到了一个大问题。为了更好地解释它,首先在这里使用计算方法的代码:

JRadioButton yesButton   = new JRadioButton("Yes"  , true);
JRadioButton noButton    = new JRadioButton("No"   , false);
JRadioButton maybeButton = new JRadioButton("Maybe", false);

ButtonGroup bgroup = new ButtonGroup();
bgroup.add(yesButton);
bgroup.add(noButton);
bgroup.add(maybeButton);

JPanel radioPanel = new JPanel();
radioPanel.setLayout(new GridLayout(3, 1));
radioPanel.add(yesButton);
radioPanel.add(noButton);
radioPanel.add(maybeButton);

radioPanel.setBorder(BorderFactory.createTitledBorder(
           BorderFactory.createEtchedBorder(), "Married?"));

现在我们要解决这个问题(已经在代码中添加了一些注释):

每当我调用该方法时,将首先调用cMonthly返回。 在Debug-Mode中,我检查了一下,我可以说:命中return语句后,计算就完成了(以正确的方式)。

现在,我需要一个想法或示例,如何使我的代码首先(按正确的顺序)执行所有 public BigDecimal calculateMonthlyCosts(SubViewModel subViewModel, Context context){ //set this two times just for debugging reasons to see if the calculation actually works cMonthly = new BigDecimal(0); subViewModel.getAllMonthlyCosts().observe((LifecycleOwner) context, new Observer<BigDecimal>() { @Override public void onChanged(@Nullable BigDecimal bigDecimal) { cMonthly = new BigDecimal(0); if (bigDecimal != null) { cMonthly = cMonthly.add(bigDecimal); } } }); subViewModel.getAllBiannuallyCosts().observe((LifecycleOwner) context, new Observer<BigDecimal>() { @Override public void onChanged(@Nullable BigDecimal bigDecimal) { cBiannually = new BigDecimal(0); if (bigDecimal != null) { cBiannually = cBiannually.add(bigDecimal.divide(new BigDecimal(6), 2)); } } }); subViewModel.getAllYearlyCosts().observe((LifecycleOwner) context, new Observer<BigDecimal>() { @Override public void onChanged(@Nullable BigDecimal bigDecimal) { cYearly = new BigDecimal(0); if (bigDecimal != null) { cYearly = cYearly.add(bigDecimal.divide(new BigDecimal(12), 2)); cMonthly = cMonthly.add(cBiannually).add(cYearly); } } }); //return is hit before the calculation so it only returns "0" return cMonthly; } 方法,然后在返回语句后执行。

我知道这有点棘手,因为我正在使用LiveData / ViewModel,但是也许有人有主意!太棒了!谢谢你!

1 个答案:

答案 0 :(得分:1)

public BigDecimal calculateMonthlyCosts(SubViewModel subViewModel...) {

如果您使用LiveData,则您的计算不应以同步函数的形式立即进行。

您不想返回BigDecimal,而是想创建一个基于您的其他LiveData之间的链的LiveData,当任何一个LiveData更改时,该链将更新BigDecimal。

为此,您应该创建一个MediatorLiveData,并应观察到LiveData在BigDecimal的任何“组件”发生更改时都将接收最新值。

public LiveData<BigDecimal> calculateMonthlyCosts(SubViewModel subViewModel) {
    MediatorLiveData<BigDecimal> mediator = new MediatorLiveData<>() {
        private BigDecimal cMonthly = new BigDecimal(0);
        private BigDecimal cBiannually = new BigDecimal(0);
        private BigDecimal cYearly = new BigDecimal(0);

        {
            addSource(subViewModel.getAllMonthlyCosts(), new Observer<BigDecimal>() {
                @Override
                public void onChanged(@Nullable BigDecimal bigDecimal) {
                    if (bigDecimal != null) {
                        cMonthly = cMonthly.add(bigDecimal);
                        setValue(cMonthly);
                    }
                }
            });

            addSource(subViewModel.getAllBiannuallyCosts(), new Observer<BigDecimal>() {
                @Override
                public void onChanged(@Nullable BigDecimal bigDecimal) {
                    if (bigDecimal != null) {
                        cBiannually = cBiannually.add(bigDecimal.divide(new BigDecimal(6), 2));
                        setValue(cMonthly); // TODO: ???
                    }
                }
            });

            addSource(subViewModel.getAllYearlyCosts(), new Observer<BigDecimal>() {
                @Override
                public void onChanged(@Nullable BigDecimal bigDecimal) {
                    if (bigDecimal != null) {
                        cYearly = cYearly.add(bigDecimal.divide(new BigDecimal(12), 2));
                        cMonthly = cMonthly.add(cBiannually).add(cYearly);
                        setValue(cMonthly);
                    }
                }
            });
         }
    };

    return mediator;
}

请注意,我对您的业务逻辑不是100%肯定,可能需要遵循herehere概述的“使用元组合并多个LiveData”的方式。

您也可以参考this video