rx-java2 - 带有 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 逻辑没有错误。那应该是你的内部错误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));
推荐阅读
- python - 计算给定其他两个变量的条件概率
- c# - 通过 Curl 检查 POST 的返回值
- python - Python 'pip' 工具从哪里获取它安装的包?
- c++ - 使用单调堆栈的直觉
- python - 使用我的 picamera 流式传输时出现问题
- intellij-idea - IntelliJ 滚动控制台在测试执行后结束
- python - 如何解决:float() 参数可以是字符串或数字,而不是“地图”
- file-io - Fortran read 语句读取序列
- javascript - 如何在没有 routerLink Click 的情况下添加 queryParams?
- php - 如何解决在php的嵌套foreach循环中重置变量