如何使用Android锁定Firebase数据库中的计数器,直到ListView中的项目消失?

如何使用Android锁定Firebase数据库中的计数器,直到ListView中的项目消失?,android,listview,firebase,firebase-realtime-database,Android,Listview,Firebase,Firebase Realtime Database,我已经创建了一个列表,其中显示了一些产品。该列表可以与多个用户共享。列表中有一个名为numberOfProducts的字段。每次将产品添加到列表中时,计数器都会增加一个。每次删除产品时,计数器都会减少一个。要显示列表中的产品,我使用ListView和FirebaseListAdapter。如果列表显示在两个不同的设备上,当用户删除产品时,该项目将从其设备的列表视图中消失,计数器将减少一个 我的问题是,在第二台设备上,该项目在半秒后消失。在此短时间内,如果第二个用户尝试删除同一产品,计数器将再次减

我已经创建了一个列表,其中显示了一些产品。该列表可以与多个用户共享。列表中有一个名为
numberOfProducts
的字段。每次将产品添加到列表中时,计数器都会增加一个。每次删除产品时,计数器都会减少一个。要显示列表中的产品,我使用
ListView
FirebaseListAdapter
。如果列表显示在两个不同的设备上,当用户删除产品时,该项目将从其设备的
列表视图中消失,计数器将减少一个

我的问题是,在第二台设备上,该项目在半秒后消失。在此短时间内,如果第二个用户尝试删除同一产品,计数器将再次减少。因此,不是移除一项,而是将计数器减少两项

我的问题是,如何锁定
numberOfProducts
计数器,直到第二台设备的项目消失后才能写入

减少计数器的代码如下所示:

void decreaseCounter(String listKey) {
    final DatabaseReference ref = listsDatabaseReference.child(listKey).child("numberOfProducts");
    ref.runTransaction(new Transaction.Handler() {
        @Override
        public Transaction.Result doTransaction(final MutableData currentData) {
            if (currentData.getValue() == null) {
                currentData.setValue(0);
            } else {
                int numberOfProducts = currentData.getValue();
                int decreasedNumberOfProducts = numberOfProducts - 1;
                currentData.setValue(decreasedNumberOfProducts);
            }
            return Transaction.success(currentData);
        }

        @Override
        public void onComplete(DatabaseError databaseError, boolean committed, DataSnapshot currentData) {
            if (databaseError != null) {
                System.out.println("Firebase counter increment failed!");
            } else {
                System.out.println("Firebase counter increment succeeded!");
            }
        }
    });
}

提前谢谢

您应该使用Firebase事务处理

删除操作在哪里进行?因为这是bug的来源,所以您可能需要将其包括在内,以便在这里获得真正的帮助。见和。一种想法是使用函数进行递减,而不是依赖于客户端。但您可能也只希望在事务中删除。或者,您可能只想检查当前计数器值是否与本地计数器值匹配,并在更改后中止更改。