使用ValueEventListener读取Firebase数据

时间:2017-05-14 07:40:37

标签: android firebase firebase-realtime-database

在我的应用程序中,我经常需要读取一次数据。我最初是通过使用addListenerForSingleValueEvent()方法开始的,但是我遇到了使用此方法的问题,因为它在启用离线功能时无法正常工作(请参阅此处的问题:Firebase Offline Capabilities and addListenerForSingleValueEvent

在上面的问题中,提到了一个解决方法是使用addValueEventListener()方法,但我不完全理解如何执行此操作(特别是如何在我完成抓取所需的数据后立即删除ValueEventListener)

使用我在独立类中创建的此方法来查询Firebase上的Users节点,我在其中存储用户FCM令牌。它似乎每次都没有从服务器返回最新的令牌。

public class SendFCMMessage {
    String userToken;
    String currentUser;
    String userName;
    ValueEventListener userListener;
    public void sendMessage(final String contactNumber) {

      final DatabaseReference ref = FirebaseDatabase.getInstance().getReferenceFromUrl(link).child("Users").child(contactNumber);
        userListener = new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                User user = dataSnapshot.getValue(User.class);
                userToken = user.getToken();
                // Send FCM Message after getting user token and then remove event listener
                ref.removeEventListener(userListener);
            }

            @Override
            public void onCancelled(DatabaseError databaseError) {
                Log.d("TAG", "Something terrible went wrong: " + databaseError);
            }
        };
        ref.addValueEventListener(userListener);
    }
}

如果我删除该行

ref.removeEventListener(userListener);

然后这段代码工作正常,但我想知道如何在收到我需要的数据后立即删除ValueEventListener?

谢谢, [R

1 个答案:

答案 0 :(得分:0)

ValueEventListener vel; //Declared Global

像这样听你的DatabaseReference;

vel = yourDatabaseReference.addValueEventListener(new ValueEventListener() {
    @Override
    public void onDataChanged(DataSnapshot dataSnapShot) {
        //Do your stuff here. I suggest you create another method for this if you don't want a problem with inner class.
        //For example, workDataSnapshot(DataSnapshot dataSnapShot) <-- Work here
        yourDatabaseReference.removeEventListener(vel);
    }
    @Override
    public void onCancelled(DatabaseError databaseError) {

    }
});

希望它对你有所帮助。