确定FireBase ChildEventListener是否在继续Android之前完成了所有工作

时间:2017-05-20 00:39:02

标签: android asynchronous firebase firebase-realtime-database

我写了一个从Firebase接收数据并将其放入sharedPreferences的类。但有时它是null,有时我得到正确的数据。我的代码在下面。

private void userLogin() {
            progressDialog.setMessage("Please wait");
            progressDialog.show();
            firebaseAuth.signInWithEmailAndPassword(email, password)
                    .addOnCompleteListener(this, new OnCompleteListener<AuthResult>() {
                        @Override
                        public void onComplete(@NonNull Task<AuthResult> task) {

                           success=task.isSuccessful();
                            DatabaseReference userReference = FirebaseDatabase.getInstance().getReference().child("user");
                            userReference.addChildEventListener(new ChildEventListener() {
                                @Override
                                public void onChildAdded(DataSnapshot dataSnapshot, String s) {
                                    for (DataSnapshot postSnapshot : dataSnapshot.getChildren()) {
                                        try {
                                            User user = postSnapshot.getValue(User.class);
                                            if (user.getEmail().equals(email.getText().toString())) {
                                                username= user.getUsername();


                                                key=dataSnapshot.getKey()+"/"+postSnapshot.getKey();

                                            }
                                        }catch(Exception e){

                                        }
                                    }
                                }

                                @Override
                                public void onChildChanged(DataSnapshot dataSnapshot, String s) {

                                }

                                @Override
                                public void onChildRemoved(DataSnapshot dataSnapshot) {

                                }

                                @Override
                                public void onChildMoved(DataSnapshot dataSnapshot, String s) {

                                }

                                @Override
                                public void onCancelled(DatabaseError databaseError) {

                                }
                            });
                            CountDownTimer cd= new CountDownTimer(3000, 1000) {

                                public void onTick(long millisUntilFinished) {


                                }

                                public void onFinish() {
                                    progressDialog.dismiss();
                                    Log.d("FRIEND", "sendNewFriendRequest: "+username + " bu");

                                        SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());

                                        sharedPreferences.edit()
                                                .putString("username",username)



                                                .commit();
                                    }

                                    if (success) {
                                        Intent i1 = new Intent(getApplicationContext(),Menu.class);
                                        startActivity(i1);
                                    }

                                }
                            }.start();

                        }
                    });
        }
    }

所以我在FirebaseDB中搜索一个包含我想要的电子邮件的元素并获取其用户名。然后我尝试将这个用户名放到SharedPreferences但是当我把它放在它时它仍然是null。我怎么能解决这个问题呢?

1 个答案:

答案 0 :(得分:0)

您尝试执行的操作是在用户使用Firebase登录时验证是否存在电子邮件地址。但是如果用户已经被烧毁会发生什么?你将获得null。因此,为了解决此问题,请从signInWithEmailAndPassword方法中取出该代码,并验证即使用户已登录也存在。

希望它有所帮助。