java - 如何使 addListenerForSingleValueEvent 循环工作?
问题描述
我正在尝试根据购物车中存在的项目数量访问 addListenerForSingleValueEvent 特定次数,但由于它只听一次我无法从数据库中获取信息(即我需要获取可用的每个产品,但它只获取一次,并为购物车中的其余商品应用相同的可用价值)
私人无效updateAdminView(列表listOfItems){
final DatabaseReference cartListRef = FirebaseDatabase.getInstance().getReference().child("Cart List");
final DatabaseReference orderListRef = FirebaseDatabase.getInstance().getReference().child("Order List");
for(Cart cartItem : listOfItems)
{
final HashMap<String,Object> cartMap = new HashMap<>();
cartMap.put("pid",cartItem.getPid());
cartMap.put("name",cartItem.getName());
cartMap.put("price",cartItem.getPrice());
cartMap.put("weight",cartItem.getWeight());
cartMap.put("date",cartItem.getDate());
cartMap.put("quantity",cartItem.getQuantity());
cartMap.put("sid",cartItem.getSid());
cartMap.put("description",cartItem.getDescription());
cartMap.put("duration",cartItem.getDuration());
cartMap.put("time",cartItem.getTime());
cartMap.put("usage",cartItem.getUsage());
cartListRef.child("Admin View").child(Prevalent.currentOnlineUser.getPhone())
.child(cartItem.getPid()).updateChildren(cartMap).addOnCompleteListener(new OnCompleteListener<Void>() {
@Override
public void onComplete(@NonNull Task<Void> task) {
Toast.makeText(ConfirmFinalOrderActivity.this, "You can purchase more products once your order is verified", Toast.LENGTH_SHORT).show();
}
});
orderListRef.child("Admin View").child(Prevalent.currentOnlineUser.getPhone())
.child(cartItem.getPid()).updateChildren(cartMap);
final String dQuantity = cartItem.getQuantity();
final String pid = cartItem.getPid();
final DatabaseReference reference = FirebaseDatabase.getInstance().getReference().child("Products").child(pid);
reference.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
sAvailable = Objects.requireNonNull(dataSnapshot.child("available").getValue()).toString();
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
int quan = Integer.parseInt(dQuantity);
int Ava = Integer.parseInt(sAvailable);
int k = Ava - quan;
String d = String.valueOf(k);
reference.child("available").setValue(d).addOnCompleteListener(new OnCompleteListener<Void>() {
@Override
public void onComplete(@NonNull Task<Void> task) {
Toast.makeText(ConfirmFinalOrderActivity.this, "Done..!", Toast.LENGTH_SHORT).show();
}
});
}
}
sAvailable 的值与第一个购物车项目相同。尽管它在 for 循环中,但它并没有改变它的值。我想获取所有购物车项目的 sAvailable 值。
解决方案
firebase 数据库读写操作是异步的,这意味着您无法立即获得结果,您的代码容易出错,请尝试其他方式
使用一个事务批量更新所有,异步同步考虑使用这种模式
// outside callback
CountDownLatch countDownLatch = new CountDownLatch(1);
// in callback
countDownLatch.countDown();
// outside callback
countDownLatch.await();
// callback is invoked. do anything you want
推荐阅读
- node.js - 无法安装 Alexa ASK-CLI “请求已弃用”
- python - 给定一个 3D 图像数组,返回一个索引列表,其值高于阈值且所有选定索引之间的距离最小?
- flutter - 如何计算 Flutter/Dart 中的纵向冗余校验 (LRC)?
- c# - 错误:“NullReferenceException:对象引用未设置为对象的实例”,用于 Unity 中一个对象上的 2 个脚本
- c - 使用 waitpid 和 WNOHANG 区分进程状态
- python - 从句子中提取时间间隔实体
- if-statement - Foreach 在带有连接表的 While 循环内
- mongodb - Mongoose 查询一个数组包含另一个数组中的一个值
- scala - Spark:使用数组加入条件(可为空的)
- python - 从文件中导入 JSON 数据作为类实例