创建 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();
 }