在我的应用程序中,我经常需要读取一次数据。我最初是通过使用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
答案 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) {
}
});
希望它对你有所帮助。