【问题标题】:The Activity restart after saving data in Firebase在 Firebase 中保存数据后 Activity 重新启动
【发布时间】:2017-05-06 23:03:15
【问题描述】:

我试图将用户信息保存在 Firebase 数据库中,但发生了一种奇怪的行为,导致“保存”按钮重新启动同一活动,而不是我为下一个活动创建的 Intent。

 public void userData () {
    user.setFName(Fname.getText().toString());
    user.setLName(Lname.getText().toString());
    user.setEmail(Email.getText().toString());
    user.setAddress(userAddress.getText().toString());
    user.setPassword(UserInfo.getString("Password", ""));
    user.setID(CicID.getText().toString());
    user.setUsername(Usnm.getText().toString());
    if (bAdmn.isChecked()) user.setMajor("Business Administrator");
    if (BTech.isChecked()) user.setMajor("Business Tech");
    if (masscom.isChecked()) user.setMajor("Mass Com");
    if (Eng.isChecked()) user.setMajor("Engineering");

    final String us = user.getUsername();
    Log.i("Username", us);
    MyDatabase1.child("USERS").child(us).setValue(user);
    Intent i = new Intent(getApplicationContext() , chooseCoursesActivity.class);
    startActivity(i);

}

这是保存按钮的方法,请注意,如果用户想要更改他的名字或姓氏或其他东西,我想更新配置文件活动中的用户信息。 但点击保存按钮后,数据被正确保存,但意图从未完成。它重新创建相同的 Activity 。 在登录活动中有一个登录按钮,用于检查用户名和密码,然后尝试根据数据登录,如果登录成功,则进入该配置文件活动。 配置文件活动中的保存按钮重新在登录活动中执行登录按钮中的方法,该方法检查所有内容并转到导致重新创建问题的配置文件活动。 这是登录按钮的代码:

    MyDatabase = FirebaseDatabase.getInstance().getReference();
    MyDatabase.child("USERS").addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            boolean exists = false;

            for (DataSnapshot child : dataSnapshot.getChildren()) {
                final Map<String, Object> model = (Map<String, Object>) child.getValue();

                if (model.get("username").equals(Username.getText().toString())) {
                    exists = true;
                    Log.i("USername"," Correct");


                    if(exists){
                        MyDatabase.child("USERS").orderByChild("username").equalTo(Username.getText().toString())

                                .addListenerForSingleValueEvent(new ValueEventListener() {
                            @Override
                            public void onDataChange(DataSnapshot dataSnapshot) {

                                for (DataSnapshot child :dataSnapshot.getChildren()){
                                    Log.i("Password",child.getValue().toString());
                                   Log.i( "Password",child.child("password").toString());
                                    if(password.getText().toString().equals(child.child("password").getValue())){
                                        Log.i("LOGIN","Success");
                                         loginsuccessful = true ;

                                    if(loginsuccessful){

                                        saveCredntials(Username.getText().toString(),password.getText().toString());


                                        Intent i2 = new Intent(getApplicationContext(), ProfileActivity.class);
                                        i2.putExtra("loginStats",IsLoggedIn);
                                        i2.putExtra("Username",Un);

                                        i2.putExtra("Password",Pw);


                                        startActivity(i2);
                                        finish();}
                                    }else{
                                        Log.i("LOGIN","Failed");
                                        loginsuccessful= false ;

                                    }

                                }

                            }

                            @Override
                            public void onCancelled(DatabaseError databaseError) {
                                            Toast.makeText(getApplicationContext(),"Error",Toast.LENGTH_LONG).show();
                            }
                        });
                    }
                    break;

                }else {
                    Log.i("LOGIN","FAiled");

                }

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

        }
    });
}

抱歉让这个太长了,但我不知道问题所在。

【问题讨论】:

    标签: android firebase android-intent android-activity firebase-realtime-database


    【解决方案1】:

    我刚刚解决了这个问题!根据您的情况,请避免使用addValueEventListener,因为它会监听您对数据库所做的所有更改。这就是为什么每次对数据库进行任何更改时,无论您是否调用该登录函数,都会执行addValueEventListener (startActivity) 中的代码。

    我的建议是使用addListenerForSingleValueEvent 而不是addValueEventListener(确保您将Android 项目中的ALL addValueEventListener 更改为addListenerForSingleValueEvent),或者您甚至可以删除监听器,如果你真的不需要它。不知道是不是好设计,不过应该可以解决你的问题。

    【讨论】:

      【解决方案2】:

      避免将 startActivity 放在 firebase 监听器上。每次从 firebase 数据库中添加或删除值时都会执行 startActivity。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-09-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多