Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/firebase/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android Firebase runTransaction()执行无限循环_Android_Firebase_Firebase Realtime Database - Fatal编程技术网

Android Firebase runTransaction()执行无限循环

Android Firebase runTransaction()执行无限循环,android,firebase,firebase-realtime-database,Android,Firebase,Firebase Realtime Database,我目前正在尝试实现一种方法来计算我的数据库帖子在用户屏幕上显示的次数。为了管理可能同时进行的修改,我决定使用runTransition()方法。我在用于填充viewHolder的方法中调用此方法 然而,runTransition()方法进行无限循环,并不断增加我的nb_views计数器-即使应用程序仅在一部带有固定新闻源的手机上运行 下面是我的代码的样子: private void setupPost(final PostViewHolder postViewHolder, final Post

我目前正在尝试实现一种方法来计算我的数据库帖子在用户屏幕上显示的次数。为了管理可能同时进行的修改,我决定使用
runTransition()
方法。我在用于填充viewHolder的方法中调用此方法

然而,
runTransition()
方法进行无限循环,并不断增加我的
nb_views
计数器-即使应用程序仅在一部带有固定新闻源的手机上运行

下面是我的代码的样子:

private void setupPost(final PostViewHolder postViewHolder, final Post post, final int position, final String inPostKey) {

    /.../

    DatabaseReference ref = (FirebaseUtil.getPostsRef()).child(postKey).child("nb_views");
    ref.runTransaction(new Transaction.Handler() {
        @Override
        public Transaction.Result doTransaction(MutableData mutableData) {
            if (mutableData.getValue() != null) {
                long nb = (long) mutableData.getValue();
                mutableData.setValue(nb + 1);
            }
            else {
                mutableData.setValue(1);
            }

            return Transaction.success(mutableData);
        }

        @Override
        public void onComplete(DatabaseError databaseError, boolean b, DataSnapshot dataSnapshot) {
            Log.d(TAG, "postTransaction:onComplete:" + databaseError);
        }
    });

    /.../
每次调用
onComplete()
方法时都不会出现任何错误。最令人惊讶的是,整个
setupPost()
方法被无限期调用。当我删除
runTransaction()
方法时,一切正常,并且
setupPost()
方法对于每个post只调用一次


你知道我为什么会得到一个无限循环吗?

我想我回答得太晚了,但可能对某些人有帮助

在执行firebase runTransaction()时,会重复调用setupPost()方法,因为调用此活动的此活动(或片段)或上一个活动(或片段)中的某个地方是同一firebase子级上的值侦听器,该子级调用setupPost()方法每次在数据库中的值发生更改时


将所有值侦听器更改为单值侦听器,您的问题将得到解决。

我打赌(好吧,使用常识)setupPost是从onDataChange调用的,onDataChange的名称是在数据更改时调用的。。。很明显,这项交易已经完成了……嗯,是的,事实就是这样。。。我觉得自己很笨。我想我只是要计算post对象本身之外的视图。谢谢