Firebase addListenerForSingleValueEvent在android中不读取数据一次

Firebase addListenerForSingleValueEvent在android中不读取数据一次,android,firebase,Android,Firebase,我在安卓系统中使用firebase。 我想在firebase中读取一次数据 我读了,它说,addListenerForSingleValueEvent将读取一次数据 因此,我使用了addListenerForSingleValueEvent函数,但它重复地从firebase读取数据 如何仅从firebase读取一次数据?提前谢谢 final Firebase checkBuy = new Firebase(URI); checkBuy.addLi

我在安卓系统中使用firebase。 我想在firebase中读取一次数据

我读了,它说,
addListenerForSingleValueEvent
将读取一次数据

因此,我使用了
addListenerForSingleValueEvent
函数,但它重复地从
firebase
读取数据

如何仅从
firebase
读取一次数据?提前谢谢

            final Firebase checkBuy = new Firebase(URI);

            checkBuy.addListenerForSingleValueEvent(new ValueEventListener() {
                @Override
                public void onDataChange(DataSnapshot snapshot) {

                    checkPurchase(snapshot);

                    addListView();

                }

                @Override
                public void onCancelled(FirebaseError firebaseError) {

                }
            });

其原因不是火基,而是碎片

我在viewPager的片段中使用addListenerForSingleValueEvent。 调用viewPager的片段时,viewPager将销毁片段并再次创建片段

为了防止碎片破坏,您需要覆盖此

@Override
public void destroyItem(ViewGroup container, int position, Object object) {
    Log.d(TAG, "don't destroy!");
} 

其原因不是火基,而是碎片

我在viewPager的片段中使用addListenerForSingleValueEvent。 调用viewPager的片段时,viewPager将销毁片段并再次创建片段

为了防止碎片破坏,您需要覆盖此

@Override
public void destroyItem(ViewGroup container, int position, Object object) {
    Log.d(TAG, "don't destroy!");
} 

对于数据库引用对象,与添加事件侦听器的方法相同,也可以使用
removeEventListener
将其删除

而不是像这样创建匿名对象

    checkBuy.addListenerForSingleValueEvent(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot snapshot) {

                    checkPurchase(snapshot);

                    addListView();

            }

            @Override
            public void onCancelled(FirebaseError firebaseError) {

            }
    });
您可以创建
ValueEventListener
的命名对象,并使用
removeEventListener
onDataChange
方法末尾将其从数据库引用对象中删除

    ValueEventListener valueEventListener = new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot snapshot) {

                    checkPurchase(snapshot);

                    addListView();

                    checkBuy.removeEventListener(valueEventListener);
            }

            @Override
            public void onCancelled(FirebaseError firebaseError) {

            }
    });

    checkBuy.addValueEventListener(valueEventListener);

onDataChange
方法中的代码只执行一次,因为只要执行方法的最后一行,就会删除
ValueEventListener
对象。

对于数据库引用对象,与添加事件侦听器的方法相同,也可以使用
removeEventListener
删除它

而不是像这样创建匿名对象

    checkBuy.addListenerForSingleValueEvent(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot snapshot) {

                    checkPurchase(snapshot);

                    addListView();

            }

            @Override
            public void onCancelled(FirebaseError firebaseError) {

            }
    });
您可以创建
ValueEventListener
的命名对象,并使用
removeEventListener
onDataChange
方法末尾将其从数据库引用对象中删除

    ValueEventListener valueEventListener = new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot snapshot) {

                    checkPurchase(snapshot);

                    addListView();

                    checkBuy.removeEventListener(valueEventListener);
            }

            @Override
            public void onCancelled(FirebaseError firebaseError) {

            }
    });

    checkBuy.addValueEventListener(valueEventListener);

onDataChange
方法中的代码只执行一次,因为
ValueEventListener
对象在方法的最后一行执行后立即被删除。

所以您尝试了链接问题的答案,但没有成功?给我们看看你的代码。我更新了问题。addListView和checkPurchase函数反复调用我很愚蠢,我在片段活动中声明了addListenerForSingleValueEvent。因此,每次创建片段时,addListenerForSingleValueEvent函数都会再次调用。所以您尝试了链接问题的答案,但没有成功?给我们看看你的代码。我更新了问题。addListView和checkPurchase函数反复调用我很愚蠢,我在片段活动中声明了addListenerForSingleValueEvent。因此,每次创建片段时,都会再次调用addListenerForSingleValueEvent函数。