创建 class 时从数据库中检索数据
Retrieve data from database when class created
我有一个片段,当我的片段启动时我需要查询我的 firebase 实时数据库。我是在onCreate方法运行的时候直接添加数据库连接代码,打印toast的时候还是报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();
所以我所做的是尝试包装所有数据库连接并在静态块中检索代码,因为这应该 运行 在创建 class 时首先
static{
// everything in here from above code excluding the toast
}
然后我尝试在 onCreateView()
中再次打印 postCount 但仍然得到相同的结果,其中 postCount 为 null
我该如何克服这个问题?
谢谢
P.S我确定我正在监听的节点存在于数据库中
这只是因为 addListenerForSingleValueEvent
正在处理另一个关闭的 UI 线程(后台线程),而您的 Toast.makeText(...)
正在处理 UI 线程。
因此 Toast.makeText(..)
的执行甚至发生在 postCount 的值更新之前。因此在 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();
}
我有一个片段,当我的片段启动时我需要查询我的 firebase 实时数据库。我是在onCreate方法运行的时候直接添加数据库连接代码,打印toast的时候还是报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();
所以我所做的是尝试包装所有数据库连接并在静态块中检索代码,因为这应该 运行 在创建 class 时首先
static{
// everything in here from above code excluding the toast
}
然后我尝试在 onCreateView()
中再次打印 postCount 但仍然得到相同的结果,其中 postCount 为 null
我该如何克服这个问题?
谢谢
P.S我确定我正在监听的节点存在于数据库中
这只是因为 addListenerForSingleValueEvent
正在处理另一个关闭的 UI 线程(后台线程),而您的 Toast.makeText(...)
正在处理 UI 线程。
因此 Toast.makeText(..)
的执行甚至发生在 postCount 的值更新之前。因此在 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();
}