带有RXJava2的Android Room;发射器的onNext()未正确触发

时间:2018-08-07 01:25:59

标签: rx-java2 android-room android-databinding

我正在从异步任务切换到rxjava2,我的代码测试遇到了一些问题。

我有一个房间表,其中有一定金额的元素。在一个名为DisplayCurrentBudget的用户控件上,应显示所有金额的总和。每当插入新元素时,此编号都必须刷新。我通过两种方式解决了该需求,但是两种方式都产生了相同的结果:我的代码不在乎数据库是否已更新,仅在重新创建片段(onCreateView)时才更新。

我的第一次尝试是

//RxJava2 Test
    Observable<ItemS> ItemObservable = Observable.create( emitter -> {
        try {
            List<ItemS> movies = oStandardModel.getItemsVanilla();
            for (ItemS movie : movies) {
                emitter.onNext(movie);
            }
            emitter.onComplete();
        } catch (Exception e) {
            emitter.onError(e);
        }
    });


    DisposableObserver<ItemS> disposable = ItemObservable.
        subscribeOn(Schedulers.io()).
        observeOn(AndroidSchedulers.mainThread()).
        subscribeWith(new DisposableObserver<ItemS>() {
            public List<ItemS> BadFeelingAboutThis = new ArrayList<ItemS>();

            @Override
            public void onNext(ItemS movie) {
                // Access your Movie object here
                BadFeelingAboutThis.add(movie);
            }
            @Override
            public void onError(Throwable e) {
                // Show the user that an error has occurred
            }
            @Override
            public void onComplete() {
                // Show the user that the operation is complete
                oBinding.DisplayCurrentBudget.setText(Manager.GetBigSum(BadFeelingAboutThis).toString());
            }
    });

我已经对该代码感到不舒服。我的第二次尝试产生了完全相同的结果:

Observable<BigDecimal> ItemObservable2 = Observable.create( emitter -> {
        try {
            BigDecimal mySum = oStandardModel.getWholeBudget();
            emitter.onNext(mySum);
            emitter.onComplete();
        } catch (Exception e) {
            emitter.onError(e);
        }
    });

    DisposableObserver<BigDecimal> disposable = ItemObservable2.
            subscribeOn(Schedulers.io()).
            observeOn(AndroidSchedulers.mainThread()).
            subscribeWith(new DisposableObserver<BigDecimal>() {
                @Override
                public void onNext(BigDecimal sum) {
                    // Access your Movie object here
                    oBinding.DisplayCurrentBudget.setText(sum.toString());
                }
                @Override
                public void onError(Throwable e) {
                    // Show the user that an error has occurred
                }
                @Override
                public void onComplete() {
                    // Show the user that the operation is complete
                }
            });

我的代码有任何明显的问题吗?

感谢阅读,非常感谢!

编辑: 我被问到Manager.GetBigSum做了什么,实际上并没有做什么用。它只会添加Item列表的BigDecimal-Values。

public static BigDecimal GetBigSum(List<ItemS> ListP){

    List<BigDecimal> bigDList = ListP.stream().map(ItemS::get_dAmount).collect(Collectors.toList());

    return bigDList.stream()
            .reduce(BigDecimal.ZERO, BigDecimal::add);
}

此外,我简化了查询。但是它仍然不关心数据库更新,仅关心片段重新创建:

Single.fromCallable(() -> oStandardModel.getItemsVanilla())
            .map(Manager::GetBigSum)
            .subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe(
                    e -> oBinding.DisplayCurrentBudget.setText(e.toString())
            );

2 个答案:

答案 0 :(得分:1)

您的接收逻辑没有错误。这应该是您的getWholeBudget中的内部错误。

但是为什么您编写的rx如此复杂?

对于您的情况,您可以只写:

Single.fromCallable(() -> oStandardModel.getItemsVanilla())
      .map(Manager::GetBigSum)
      .subscribeOn(Schedulers.io())
      .observeOn(AndroidSchedulers.mainThread())
      .subscribe(
         e -> oBinding.DisplayCurrentBudget.setText(sum.toString()),
         e -> log.error(e));

答案 1 :(得分:0)

我这样解决了:

oStandardModel.getItemJointCatLive().observe(this, new Observer<List<ItemJointCat>>() {
            @Override
            public void onChanged(@Nullable final List<ItemJointCat> oItemSP) {
                Single.fromCallable(() -> oStandardModel.getWholeBudget())
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(
                        e -> oBinding.DisplayCurrentBudget.setText(e.toString())
                );
            }
        });

我的错误是我以为RXjava2不需要onchanged事件...现在我只是使用livedataobserver的onchanged事件来触发简单的rxjava2查询。

您认为这种方法有什么问题吗?