我的databaseReference的valueEventListener onDataChange方法不会触发

时间:2018-08-06 01:06:49

标签: java android firebase firebase-realtime-database

在我从某个特定用户收集所有数据并进行显示的Activity中,此onDataChange方法会正确地正确触发数据。

final User user = new User();

     databaseReference.addValueEventListener(new ValueEventListener()
     {
         @Override
         public void onDataChange(@NonNull DataSnapshot dataSnapshot)
         {
             user.setFirstName(dataSnapshot.getValue(User.class).getFirstName());
             view_profile_firstName.setText(user.getFirstName().toString());

             user.setLastName(dataSnapshot.getValue(User.class).getLastName());
             view_profile_lastName.setText(user.getLastName().toString());

             user.setEmail(dataSnapshot.getValue(User.class).getEmail());
             view_profile_email.setText(user.getEmail().toString());

             user.setAge(dataSnapshot.getValue(User.class).getAge());
             view_profile_age.setText(Integer.toString(user.getAge()));

             user.setGender(dataSnapshot.getValue(User.class).getGender());
             view_profile_gender.setText(user.getGender());

             user.setProfileComplete(dataSnapshot.getValue(User.class).getProfileComplete());
             view_profile_profileComplete.setText(String.valueOf(user.getProfileComplete()));

         }

         @Override
         public void onCancelled(@NonNull DatabaseError databaseError)
         {

         }
     });

尽管现在我正在尝试在当前用户登录时检查profileComplete是否为true。我希望这种方法的工作方式是,一旦用户注册了一个帐户,他的数据就存储为空字符串并且profileComplete已设置虚假。填写完所有数据并保存配置文件profileComplete后,将其设置为true。原因是当他们在关闭应用程序后重新登录时,我希望它带他们到主屏幕,而不是通过创建配置文件重新运行它们。

这是他们成功使用电子邮件和密码登录后的登录活动的样子。

firebaseAuth.signInWithEmailAndPassword(email, password).addOnCompleteListener(this, new OnCompleteListener<AuthResult>()
    {
        @Override
        public void onComplete(@NonNull Task<AuthResult> task)
        {
            if (task.isSuccessful())
            {
                final User user = new User();

                Toast.makeText(MainActivity.this, "Successful login!", Toast.LENGTH_SHORT).show();

                //Dialog related to alerting the user we are logging them in
                progressDialog.cancel();

                //Check if logging in user has completed profile or not.
                databaseReference = firebaseDatabase.getReference("Users/" + firebaseAuth.getInstance().getCurrentUser().getUid());
                databaseReference.addValueEventListener(new ValueEventListener()
                {
                    @Override
                    public void onDataChange(@NonNull DataSnapshot dataSnapshot)
                    {
                        user.setProfileComplete(dataSnapshot.getValue(User.class).getProfileComplete());
                    }

                    @Override
                    public void onCancelled(@NonNull DatabaseError databaseError)
                    {
                        Log.d("MainActivity", "COULD NOT RECIEVE PROFILECOMPLETE FROM DATABASE");
                    }
                });

                //The profileComplete method returns TRUE, so we can skip the profile creation.
                if(user.getProfileComplete())
                {
                    Intent intent = new Intent(MainActivity.this, ViewProfileActivity.class);
                    startActivity(intent);
                }

                //the profileComplete method returns FALSE, we must send the user to the profile creation.
                else
                {
                    Intent intent = new Intent(MainActivity.this, ProfileActivity.class);
                    startActivity(intent);
                }

我浏览了大约45分钟到一个小时的stackoverflow,以查看各种解决方案,例如尝试使用异步处理。

我的假设是,因为这都是在主线程上运行的,所以onDataChange方法不会及时将其数据用于if语句。尽管尝试解决此问题,我还是把

databaseReference.addValueEventListener(new ValueEventListener()

在while循环中,布尔变量设置为false,只有在onDataChanged()方法触发后才将其设置为true。尽管这似乎从未发生过,但现在我还是很困惑。

非常感谢所有帮助,请发送指向我可以阅读的文档的链接,以加深我对该主题的理解。

1 个答案:

答案 0 :(得分:0)

您已经在问题中描述了导致此问题的原因。因此,解决此问题的一种方法如下-

databaseReference = firebaseDatabase.getReference("Users/" + firebaseAuth.getInstance().getCurrentUser().getUid());
databaseReference.addValueEventListener(new ValueEventListener() {
    @Override
    public void onDataChange(@NonNull DataSnapshot dataSnapshot) {

        user.setProfileComplete(dataSnapshot.getValue(User.class).getProfileComplete());

        //The profileComplete method returns TRUE, so we can skip the profile creation.
        if(user.getProfileComplete()) {
            Intent intent = new Intent(MainActivity.this, ViewProfileActivity.class);
            startActivity(intent);
        }

        //the profileComplete method returns FALSE, we must send the user to the profile creation.
        else {
            Intent intent = new Intent(MainActivity.this, ProfileActivity.class);
            startActivity(intent);
        }
    }

    @Override
    public void onCancelled(@NonNull DatabaseError databaseError) {
        Log.d("MainActivity", "COULD NOT RECIEVE PROFILECOMPLETE FROM DATABASE");
    }
});