1 回答
TA贡献2021条经验 获得超8个赞
数据从 Firebase 异步加载。由于您不能getUserName等到数据可用(这意味着您的应用程序变得无响应),因此您无法像这样返回用户名。
要了解原因,请放置一些日志记录语句,如下所示:
System.out.println("Before attaching listener");
myRef.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
System.out.println("Got data");
}
@Override
public void onCancelled(DatabaseError databaseError) {
throw databaseError.toException();
}
});
System.out.println("After attaching listener");
当您运行此代码时,它会打印:
在附加侦听器之前
附加监听器后
得到数据
这可能不是您所期望的。但它确实解释了为什么您不能返回用户名。到return语句执行时,数据还没有加载,onDataChange()也没有被调用。
有两种常见的解决方法:
将需要用户名的代码移动到getUserName方法中。这是迄今为止最简单的getUserName方法,但会降低您的方法的可重用性。
创建一个回调接口,您传入该接口,getUserName然后在加载用户名时调用该接口。这类似于ValueEventListener.onDataChangeFirebase 本身的内容,但特定于您的应用程序逻辑。
我建议您不要在此处显示两者的代码,而是在此处查看我的答案:getContactsFromFirebase() 方法返回一个空列表
添加回答
举报