使用firebase同时点击android

时间:2018-03-12 20:21:59

标签: android firebase button firebase-realtime-database

我完全很困惑如何处理两个用户同时完成的点击。他们点击的按钮是从db中获取值,然后将其发送回firebase db。 现在问题是当两个用户同时点击同一个按钮时,值只改变一次,即如果value为0则将其更改为1。 我想要的是其中一个用户应该等待一段时间,直到第一个增加值,一旦值更新,那么第二个用户应该能够做同样的事情,最终在db中产生值2。 但是如何做到这一点......?

在哪里以及如何使用valueEvenListener();或者还有别的东西..?

1 个答案:

答案 0 :(得分:0)

您需要transaction,名称可能会令人困惑,因为数据库的每个操作都是一个事务。但是这种方法有一些非常有趣的特性:

  • 就像是数据库的桥梁,它将允许您询问数据并基于此,做一些事情。它在此操作期间保持连接状态。
  • 侦听器有一个特殊的逻辑方法,然后另一个用于UI

这是documentation

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个用户同时点击该怎么办。拥有最快互联网的人获得预订,另一个获得运气错误。