首页 > 解决方案 > 带有 RXJava2 的 Android 房间;发射器的 onNext() 未正确触发

问题描述

我正在从异步任务切换到 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 做了什么,它实际上并没有做太多。它只添加项目列表的 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())
            );

标签: rx-java2android-roomandroid-databinding

解决方案


您的 rx 逻辑没有错误。那应该是你的内部错误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));

推荐阅读