欢迎用户屏幕firebase集成 - 意外结果

时间:2018-02-21 22:12:52

标签: android firebase user-interface android-activity firebase-realtime-database

我有一把钥匙' newUser'在我的firebase数据库中,可以将其设置为“真实”'或者' false',如下所示: firebase database structure click here for screenshot

我在LoginActivity类中引用了数据库,单击登录按钮调用userLogin方法后,在此方法中执行以下操作:

 mDatabase.orderByChild("email").equalTo(email)
           .addValueEventListener(new ValueEventListener() {
               @Override
               public void onDataChange(DataSnapshot dataSnapshot) {
                   for(DataSnapshot singleSnapshot: dataSnapshot.getChildren()){
                       String newUser = singleSnapshot.getValue(User.class).newUser;

                       if(newUser.equals("true")){
                          Log.d("Yes!", "this is a new user");
                          startnewActivity(singleSnapshot);
                       }else {
                           Log.d("No!", "this is an old user");
                           startnewActivity(singleSnapshot);
                       }
                   }
               }

               @Override
               public void onCancelled(DatabaseError databaseError) {

               }
           });

请注意,equalTo(email)... email是一个局部变量,用于抓取用户输入电子邮件的文本字段中的文本。 startnewActivity方法定义如下,根据用户是否为新来初始化活动:

 private void startnewActivity(DataSnapshot singleSnapshot) {
    String s = singleSnapshot.getValue(User.class).newUser;
    if (s.equals("true")) {
        Intent i = new Intent(LoginActivity.this, AudiometryNewUser.class);
        singleSnapshot.getRef().child("newUser").setValue("false");
        Log.d("iterated!?", "");
        startActivity(i);
        return;

    }
    else if(s.equals("false")){
        Intent i = new Intent(LoginActivity.this, MainDashboard.class);
        Log.d("iterated", "");
        startActivity(i);
    }

}

我的意图是当用户是newUser = true时,他们将被带到欢迎屏幕AudiometryNewUser,并且newUser值将采用" false"。

然而,结果是用户始终被带到仪表板,即使他们是新用户。如果他们是newUser并登录,则在单击后退按钮时,用户将导航到预期的欢迎新用户活动。 除此之外,有时会启动几个活动实例。

我只是想知道是否有人能解释为什么会这样,我没看到什么? 如果需要明确,请说明,我会尽力更新帖子。

非常感谢提前。

1 个答案:

答案 0 :(得分:0)

从实验和进一步阅读:

为每个更改的值调用addValueEvent侦听器,因此在将singleSnapShot设置为false时,这会影响更改值,从而再次调用侦听器。相反,正确的方法是为单个值事件使用Listener。 当交换此方法时,解决方案按预期工作。