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

时间:2016-02-18 01:45:42

标签: android firebase

我在android中使用firebase。 我想在firebase中读取一次数据。

我读了question,它说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) {

                }
            });

2 个答案:

答案 0 :(得分:0)

它的原因不是firebase,碎片。

我在viewPager的片段中使用了addListenerForSingleValueEvent。 当viewPager的片段被调用时,viewPager会破坏片段并再次创建片段。

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

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

答案 1 :(得分:0)

对于数据库引用对象,与添加事件侦听器的方式相同,也可以使用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 对象在该方法的最后一行执行后立即被删除。