我正在从异步任务切换到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())
);
答案 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查询。
您认为这种方法有什么问题吗?