【问题标题】:Read Firebase Data Once With ValueEventListener使用 ValueEventListener 读取 Firebase 数据一次
【发布时间】:2017-10-13 04:15:55
【问题描述】:

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

在上面的问题中提到了一种解决方法是使用 addValueEventListener() 方法,但是我不完全理解如何做到这一点(特别是当我完成获取所需的数据后如何删除 ValueEventListener) .

采用我在独立类中创建的方法来查询 Firebase 上存储用户 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?

谢谢, 回复

【问题讨论】:

    标签: android firebase firebase-realtime-database


    【解决方案1】:
    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) {
    
        }
    });
    

    希望对你有帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-10-10
      • 2021-07-29
      • 1970-01-01
      • 2017-03-09
      • 1970-01-01
      • 2018-03-17
      • 1970-01-01
      相关资源
      最近更新 更多