Firebase runTransaction()进行无限循环

时间:2017-06-14 22:10:36

标签: android firebase firebase-realtime-database

我目前正在尝试实现一种方法来计算我的数据库的帖子在用户屏幕上显示的次数。为了管理可能的同步修改,我决定使用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()方法一次......

为什么我会得到一个无限循环的任何想法?

1 个答案:

答案 0 :(得分:0)

我认为我回答得太迟了,但可能会对某人有所帮助。

您的firebase runTransaction()执行时,会重复调用您的setupPost()方法,因为此活动(或片段)中的某个位置,或调用此活动的先前活动(或片段)中的某个位置,是同一firebase子对象上的值侦听器,每当数据库中的值发生更改时,该方法都会调用setupPost()方法。

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