如何检查可观察对象中的空数组?
How check an empty array in the observable?
我在使用 android 的 rxJava 时遇到了问题。我花了很多时间来解决我的问题,大约一天,但找不到答案。关于我的问题。我有一个数据库查询,我想检查一个空数组,我在订阅者中显示了一条关于它的消息。是的,我可以做到,但我认为有更好的解决方案。在此 answer 中,我发现了类似的问题,但此运算符对我不起作用。
这是我的 observable 和 subscriber
代码
private void getCategory(){
observable = Observable.create(new Observable.OnSubscribe<PaginatedScanList<ProductDO>>() {
@Override
public void call(Subscriber<? super PaginatedScanList<ProductDO>> subscriber) {
final Map<String, AttributeValue> filterExpressionAttributeValues = new HashMap<>();
filterExpressionAttributeValues
.put(":val1", new AttributeValue().withS(category));
final DynamoDBScanExpression scanExpression = new DynamoDBScanExpression()
.withFilterExpression("category = :val1")
.withExpressionAttributeValues(filterExpressionAttributeValues);
PaginatedScanList<ProductDO> result = dynamoDBMapper.scan(ProductDO.class, scanExpression);
Log.d(TAG, "response size is " + result.size());
subscriber.onNext(result);
subscriber.onCompleted();
}
}).switchIfEmpty(Observable.create(subscriber -> subscriber.onNext(null)));
subscriber = new Subscriber<ProductDO>() {
@Override
public void onCompleted() {
loadCategoryProduct.setVisibility(View.INVISIBLE);
}
@Override
public void onError(Throwable e) {
e.printStackTrace();
Toast.makeText(getActivity(), "something went wrong, please restart app", Toast.LENGTH_SHORT).show();
getActivity().onBackPressed();
}
@Override
public void onNext(ProductDO productDO) {
if (productDO == null)
Toast.makeText(getActivity(), "No item in this category", Toast.LENGTH_SHORT).show();
else {
productItem.add(productDO);
adapter.notifyDataSetChanged();
Log.d(TAG, "result category " + productDO.getName());
}
}
};
observable
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.flatMap(product -> Observable.from(product))
.subscribe(subscriber);
}
请帮助我,我不知道为什么 switchIfEmpty 不起作用或者我做错了什么。提前致谢。
您可以只使用 filter
运算符而不是 switchIfEmpty
.filter(result -> {
if(result.size() > 0){
return true;
} else {
//Show your toast here
return false;
}
})
switchIfEmpty
无法按照您建议的方式工作。它没有关于项目是列表或如何获取它的大小的任何信息。运算符名称中的单词 'empty' 表示一个空流,这意味着它只会在没有发射和来自原始流的 onComplete 调用时从备份可观察对象(您的空发射)发射项目,而不是在发射列表是空。
我在使用 android 的 rxJava 时遇到了问题。我花了很多时间来解决我的问题,大约一天,但找不到答案。关于我的问题。我有一个数据库查询,我想检查一个空数组,我在订阅者中显示了一条关于它的消息。是的,我可以做到,但我认为有更好的解决方案。在此 answer 中,我发现了类似的问题,但此运算符对我不起作用。 这是我的 observable 和 subscriber
代码private void getCategory(){
observable = Observable.create(new Observable.OnSubscribe<PaginatedScanList<ProductDO>>() {
@Override
public void call(Subscriber<? super PaginatedScanList<ProductDO>> subscriber) {
final Map<String, AttributeValue> filterExpressionAttributeValues = new HashMap<>();
filterExpressionAttributeValues
.put(":val1", new AttributeValue().withS(category));
final DynamoDBScanExpression scanExpression = new DynamoDBScanExpression()
.withFilterExpression("category = :val1")
.withExpressionAttributeValues(filterExpressionAttributeValues);
PaginatedScanList<ProductDO> result = dynamoDBMapper.scan(ProductDO.class, scanExpression);
Log.d(TAG, "response size is " + result.size());
subscriber.onNext(result);
subscriber.onCompleted();
}
}).switchIfEmpty(Observable.create(subscriber -> subscriber.onNext(null)));
subscriber = new Subscriber<ProductDO>() {
@Override
public void onCompleted() {
loadCategoryProduct.setVisibility(View.INVISIBLE);
}
@Override
public void onError(Throwable e) {
e.printStackTrace();
Toast.makeText(getActivity(), "something went wrong, please restart app", Toast.LENGTH_SHORT).show();
getActivity().onBackPressed();
}
@Override
public void onNext(ProductDO productDO) {
if (productDO == null)
Toast.makeText(getActivity(), "No item in this category", Toast.LENGTH_SHORT).show();
else {
productItem.add(productDO);
adapter.notifyDataSetChanged();
Log.d(TAG, "result category " + productDO.getName());
}
}
};
observable
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.flatMap(product -> Observable.from(product))
.subscribe(subscriber);
}
请帮助我,我不知道为什么 switchIfEmpty 不起作用或者我做错了什么。提前致谢。
您可以只使用 filter
运算符而不是 switchIfEmpty
.filter(result -> {
if(result.size() > 0){
return true;
} else {
//Show your toast here
return false;
}
})
switchIfEmpty
无法按照您建议的方式工作。它没有关于项目是列表或如何获取它的大小的任何信息。运算符名称中的单词 'empty' 表示一个空流,这意味着它只会在没有发射和来自原始流的 onComplete 调用时从备份可观察对象(您的空发射)发射项目,而不是在发射列表是空。