Java 未触发Firebase addValueEventListener
上周左右,我在从Firebase数据库检索数据时遇到了麻烦。 我已经在StackOverflow和google上搜索过这个问题的答案,要么我不理解所提供的解决方案,要么他们根本不适合我。在到达valueEventListener之前,所有内容都将被成功调用。我已经记录了所有事情,但它从未触发过。错误处理程序不返回任何错误Java 未触发Firebase addValueEventListener,java,android,firebase,firebase-realtime-database,Java,Android,Firebase,Firebase Realtime Database,上周左右,我在从Firebase数据库检索数据时遇到了麻烦。 我已经在StackOverflow和google上搜索过这个问题的答案,要么我不理解所提供的解决方案,要么他们根本不适合我。在到达valueEventListener之前,所有内容都将被成功调用。我已经记录了所有事情,但它从未触发过。错误处理程序不返回任何错误 public class DBHandler { private FirebaseAuth mAuth = FirebaseAuth.getInstance();
public class DBHandler {
private FirebaseAuth mAuth = FirebaseAuth.getInstance();
private String key;
public ArrayList<String>tips,tables,times;
private DatabaseReference mDatabase;
private DatabaseReference mRootRef = FirebaseDatabase.getInstance().getReference();
private DatabaseReference mPostRef = mRootRef.child("user-posts");
private DatabaseReference mIdRef = mPostRef.child(mAuth.getCurrentUser().getUid());
private DatabaseReference mKeyRef;//move down
private DatabaseReference mTimeRef;
private DatabaseReference mTipRef;
private DatabaseReference mTableRef;
public DBHandler(){
//Constructor
}
public DBHandler(String key) {
tips(key);
Log.d("Test for tips()", "Triggered");
}
public void tips(String key){
mKeyRef = mIdRef.child(key);
mTipRef = mKeyRef.child("tips");
Log.d("Test for reference", "mTipRef: " + mTipRef.getRef());
mTipRef.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
Log.d("Test for listener", "Triggered");
ArrayList<String> placeholder= new ArrayList<String>();
placeholder = dataSnapshot.getValue(ArrayList.class);
Log.d("Test for placeholder", "placeholder: " + placeholder);
tipsHolder(placeholder);
}
@Override
public void onCancelled(DatabaseError databaseError) { }
});
}
private void tipsHolder(ArrayList<String> placeholder) {
this.tips = placeholder;
}
public void times(String key){ }
public void tables(String key){ }
public void tablesHolder(ArrayList<String> placeholder){ }
public void timesHolder(ArrayList<String> placeholder){ }
}
公共类DBHandler{
私有FirebaseAuth mAuth=FirebaseAuth.getInstance();
私钥;
公共阵列列表提示、表格、时间;
私有数据库参考数据库;
private DatabaseReference mRootRef=FirebaseDatabase.getInstance().getReference();
私有数据库引用mPostRef=mRootRef.child(“用户帖子”);
私有数据库引用mIdRef=mPostRef.child(mAuth.getCurrentUser().getUid());
私有数据库引用mKeyRef;//下移
私有数据库引用mTimeRef;
私有数据库引用mTipRef;
私有数据库引用mTableRef;
公共DBHandler(){
//建造师
}
公共数据库处理程序(字符串键){
提示(关键);
Log.d(“测试提示()”,“已触发”);
}
公共作废提示(字符串键){
mKeyRef=mIdRef.child(键);
mTipRef=mKeyRef.child(“提示”);
Log.d(“参考测试”,“mTipRef:+mTipRef.getRef());
mTipRef.addValueEventListener(新的ValueEventListener(){
@凌驾
公共void onDataChange(DataSnapshot DataSnapshot){
Log.d(“侦听器测试”、“已触发”);
ArrayList占位符=新的ArrayList();
占位符=dataSnapshot.getValue(ArrayList.class);
Log.d(“占位符测试”,“占位符:+占位符”);
酒保(占位符);
}
@凌驾
已取消的公共void(DatabaseError DatabaseError){}
});
}
私人无效酒保(ArrayList占位符){
this.tips=占位符;
}
公共无效时间(字符串键){}
公共空表(字符串键){}
公共空表持有者(ArrayList占位符){}
public void timeholder(ArrayList占位符){}
}
提前感谢所有试图帮助我解决这一难题的人。我复制了您的代码并运行了它。当存在网络连接时,侦听器为我触发。我可以在没有连接的情况下让它不着火。你确定你有网络连接吗?您可以按照中的说明监视连接状态。@qbix谢谢您的回复。我尝试在您链接的dev文档中使用连接测试,但得到的行为与我原来的侦听器相同,只是没有调用侦听器。然而,它对你有效的事实让你对一种可能性有了一些洞察力。现在,我正在创建Dbhandler作为一个对象,然后尝试从该对象中提取信息。也许我应该尝试另一种方法?我从未见过听众在课堂上像你这样使用。也许是非传统的,但应该有效。在我的测试中,我只是创建了
DBHandler
的一个实例。不要将连接侦听器放在DBHandler
中。将它放在主要活动的onCreate()
中。您还可以尝试启用调试日志记录:FirebaseDatabase.getInstance().setLogLevel(Logger.Level.debug)
。我已将连接侦听器移动到主活动,并按照您的建议将其放入onCreate,连接成功。因此,似乎出于某种原因,当它在DBHandler中时,它没有足够的时间响应。我只是注意到侦听器的onCancelled()
方法中没有调试日志语句。放点东西进去。我敢打赌它是在报告一些错误,可能是访问失败。您是否为数据库设置了安全规则?