我有一个片段,当我的Fragment启动时,我需要查询我的firebase实时数据库。我在运行onCreate方法时直接添加数据库连接代码,打印吐司时仍然为null。
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container,
@Nullable Bundle savedInstanceState) {
View r = inflater.inflate(R.layout.friends, container, false);
FirebaseAuth mAuth = FirebaseAuth.getInstance();
FirebaseUser user = mAuth.getCurrentUser();
FirebaseDatabase db = FirebaseDatabase.getInstance();
String userEmail = user.getEmail();
DatabaseReference userDetails = db.getReference("users").child(userEmail);
userDetails.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
myUser = dataSnapshot.getValue(User.class);
postCount = myUser.getTotalPosts();
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
Toast.makeText(getActivity(), "jjjjj " + postCount, Toast.LENGTH_SHORT).show();
所以我做的是尝试包装所有数据库连接并在静态块中检索代码,因为这应该在创建类时首先运行
static{
// everything in here from above code excluding the toast
}
然后我尝试在onCreateView()
内再次打印 postCount ,但仍然得到postCount为空的相同结果
我如何克服这个问题?
感谢
P.S我确信我正在侦听的节点存在于数据库中
答案 0 :(得分:1)
这只是因为addListenerForSingleValueEvent
正在处理另一个关闭的UI线程(后台线程)而你的Toast.makeText(...)
正在处理UI线程。
因此,即使在更新postCount的值之前,也会执行Toast.makeText(..)
。因此,在Toast.makeText()
中,您将获得postCount的默认值。
要删除它,您可以写
Toast.makeText(getActivity(), "jjjjj " + postCount, Toast.LENGTH_SHORT).show();
在你的onDataChange方法中。
例如:
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
myUser = dataSnapshot.getValue(User.class);
postCount = myUser.getTotalPosts();
Toast.makeText(getActivity(), "jjjjj " + postCount, Toast.LENGTH_SHORT).show();
}