每个循环无限
Infinite for each loop
所以我有这个循环,这意味着循环遍历产品列表并检查它们是否已售罄或库存是否需要更新。但不知何故它是无限的,我使用调试器经历了几个断点,它只是不断循环回来,这就是我在查看后如何知道它是无限的,但我找不到问题
public void removeProductsFromDB(ArrayList<String> products) {
for (String ID : products) {
productsRef.child(ID)
.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot snapshot) {
if (snapshot.exists()) {
ProductModel model = snapshot.getValue(ProductModel.class);
int ordered = 1;
int newQuantity = Integer.parseInt(model.getpQuantity()) - ordered;
model.setpQuantity(String.valueOf(newQuantity));
if (newQuantity < 1) {
model.setStatus("Sold");
} else {
}
DatabaseReference prod = FirebaseDatabase
.getInstance().getReference().child("Products");
prod.child(ID).setValue(model)
.addOnCompleteListener(new OnCompleteListener<Void>() {
@Override
public void onComplete(@NonNull Task<Void> task) {
loadingBar.dismiss();
showToast("Order Placed");
Intent intent = new Intent(ConfirmOrderActivity.this, HomeActivity.class);
startActivity(intent);
}
});
}
}
@Override
public void onCancelled(@NonNull DatabaseError error) {
}
});
}
}
可能我只是累了,但我不认为 for-each 循环会变成无限循环。
当您使用 Query#addValueEventListener() 方法时,这意味着您正在附加一个侦听 real-time 更新的侦听器。这意味着实时数据库中发生的与您的 productsRef.child(ID)
引用相对应的每个更改都将始终触发 onDataChange()
方法。由于您使用以下方法在回调中添加数据:
prod.child(ID).setValue(model)
对于您正在收听的完全相同的引用,您的数据被再次写入。所以这种机制一遍又一遍地发生,因此出现了“无限循环”的行为。
要解决这个问题,只需将上面的方法调用更改为Query#addListenerForSingleValueEvent()。这意味着它将监听变化只一次。
所以我有这个循环,这意味着循环遍历产品列表并检查它们是否已售罄或库存是否需要更新。但不知何故它是无限的,我使用调试器经历了几个断点,它只是不断循环回来,这就是我在查看后如何知道它是无限的,但我找不到问题
public void removeProductsFromDB(ArrayList<String> products) {
for (String ID : products) {
productsRef.child(ID)
.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot snapshot) {
if (snapshot.exists()) {
ProductModel model = snapshot.getValue(ProductModel.class);
int ordered = 1;
int newQuantity = Integer.parseInt(model.getpQuantity()) - ordered;
model.setpQuantity(String.valueOf(newQuantity));
if (newQuantity < 1) {
model.setStatus("Sold");
} else {
}
DatabaseReference prod = FirebaseDatabase
.getInstance().getReference().child("Products");
prod.child(ID).setValue(model)
.addOnCompleteListener(new OnCompleteListener<Void>() {
@Override
public void onComplete(@NonNull Task<Void> task) {
loadingBar.dismiss();
showToast("Order Placed");
Intent intent = new Intent(ConfirmOrderActivity.this, HomeActivity.class);
startActivity(intent);
}
});
}
}
@Override
public void onCancelled(@NonNull DatabaseError error) {
}
});
}
}
可能我只是累了,但我不认为 for-each 循环会变成无限循环。
当您使用 Query#addValueEventListener() 方法时,这意味着您正在附加一个侦听 real-time 更新的侦听器。这意味着实时数据库中发生的与您的 productsRef.child(ID)
引用相对应的每个更改都将始终触发 onDataChange()
方法。由于您使用以下方法在回调中添加数据:
prod.child(ID).setValue(model)
对于您正在收听的完全相同的引用,您的数据被再次写入。所以这种机制一遍又一遍地发生,因此出现了“无限循环”的行为。
要解决这个问题,只需将上面的方法调用更改为Query#addListenerForSingleValueEvent()。这意味着它将监听变化只一次。