在创建类时

时间:2017-01-28 22:07:24

标签: android firebase firebase-realtime-database oncreate

我有一个片段,当我的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我确信我正在侦听的节点存在于数据库中

1 个答案:

答案 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();
 }