我完全很困惑如何处理两个用户同时完成的点击。他们点击的按钮是从db中获取值,然后将其发送回firebase db。 现在问题是当两个用户同时点击同一个按钮时,值只改变一次,即如果value为0则将其更改为1。 我想要的是其中一个用户应该等待一段时间,直到第一个增加值,一旦值更新,那么第二个用户应该能够做同样的事情,最终在db中产生值2。 但是如何做到这一点......?
在哪里以及如何使用valueEvenListener();或者还有别的东西..?
答案 0 :(得分:0)
您需要transaction
,名称可能会令人困惑,因为数据库的每个操作都是一个事务。但是这种方法有一些非常有趣的特性:
databaseRef.runTransaction(new Transaction.Handler() {
@Override
public Transaction.Result doTransaction(MutableData mutableData) {
//Don't call the ui here, it will break the execution
//There is no warning about this, neither a crash, but won't work
//If you are working with a model
YourObject object = mutableData.getValue(YourObject.class);
int increase = object.getCounter();
increase++;
object.setCounter(increase);
mutableData.setValue(object);
//If you are not working with a model
int counter = mutableData.getValue(Integer.class)
counter++;
mutableData.setValue(counter);
//Finally you always have to return telling what happened
//You could have other conditions here, and return the object untouched
//If by any condition nothing happens return the original mutable data
return Transaction.success(mutableData);
}
@Override
public void onComplete(DatabaseError databaseError, boolean b,
DataSnapshot dataSnapshot) {
//Here you can access the UI
//Model case
YourObject result = dataSnapshot.getValue(YourObject.class);
someView.setText(String.valueOf(result.getCount()));
//Datatype case
int count = dataSnapshot.getValue(Interger.class);
someView.setText(String.valueOf(count));
}
});
transaction
意味着在这种情况下使用,并发或竞争条件,通过在写入之前查询数据来解决。
这是并发性,同时有多个事件。
对于比赛想象保留等内容,该对象具有n
个预约,如果2个用户同时点击该怎么办。拥有最快互联网的人获得预订,另一个获得运气错误。