Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 如何将SharedReference变量保存在ondatachanged之外?_Android_Firebase Realtime Database_Sharedpreferences - Fatal编程技术网

Android 如何将SharedReference变量保存在ondatachanged之外?

Android 如何将SharedReference变量保存在ondatachanged之外?,android,firebase-realtime-database,sharedpreferences,Android,Firebase Realtime Database,Sharedpreferences,一旦登录任务成功,我将尝试从firebase获取用户详细信息。比如用户名、用户电话号码等,所以我想将这些详细信息存储在SharedReference变量中。这样我就可以在整个应用程序中使用这些变量。但是,当我试图从外部保存和访问时,它是空的 mAuth.signInWithEmailAndPassword(email, password) .addOnCompleteListener(new OnCompleteListener<AuthResult>

一旦登录任务成功,我将尝试从firebase获取用户详细信息。比如用户名、用户电话号码等,所以我想将这些详细信息存储在SharedReference变量中。这样我就可以在整个应用程序中使用这些变量。但是,当我试图从外部保存和访问时,它是空的

    mAuth.signInWithEmailAndPassword(email, password)
            .addOnCompleteListener(new OnCompleteListener<AuthResult>() {
                @Override
                public void onComplete(@NonNull Task<AuthResult> task) {
                    if (task.isSuccessful()) {

                        mProgressDialog.dismiss();

                        SharedPreferences settings = getSharedPreferences(PREFS_NAME, 0);
                          SharedPreferences.Editor editor = settings.edit();
                        FirebaseUser user = task.getResult().getUser();

                        user_tbl.addValueEventListener(new ValueEventListener() {
                            @Override
                            public void onDataChange(DataSnapshot dataSnapshot) {
                                User user1=null;
                                //Check if user not exist in database
                                if (dataSnapshot.child(user.getUid()).exists()) {

                                     user1 = dataSnapshot.child(user.getUid()).getValue(User.class);

                                 //   user_tbl.removeEventListener(this);
                                }
                                editor.putString("username", user1.getUserName());
                                editor.apply();




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


                        editor.putString("logged", "logged");
                        editor.putString("email",email);

                        editor.commit();
mAuth.使用电子邮件和密码登录(电子邮件,密码)
.addOnCompleteListener(新的OnCompleteListener(){
@凌驾
未完成的公共void(@NonNull任务){
if(task.issusccessful()){
mProgressDialog.disclose();
SharedReferences设置=GetSharedReferences(首选项名称,0);
SharedReferences.Editor=settings.edit();
FirebaseUser=task.getResult().getUser();
用户\u tbl.addValueEventListener(新的ValueEventListener(){
@凌驾
公共void onDataChange(DataSnapshot DataSnapshot){
用户user1=null;
//检查数据库中是否不存在用户
if(dataSnapshot.child(user.getUid()).exists()){
user1=dataSnapshot.child(user.getUid()).getValue(user.class);
//用户_tbl.removeEventListener(此);
}
editor.putString(“username”,user1.getUserName());
editor.apply();
}
@凌驾
已取消的公共void(DatabaseError DatabaseError){
}
});
editor.putString(“logged”、“logged”);
编辑器.putString(“email”,email);
commit();

将您的SharedReferences设置为静态,您可以轻松访问任何活动和片段之间的任何位置,这将是最好的方法之一

公共静态SharedReference设置


然后进一步使用它,我希望这对您有所帮助。

将您的SharedReferences设置为静态,您可以轻松访问任何活动和片段之间的任何位置,这将是最好的方法之一

公共静态SharedReference设置


然后进一步使用它,我希望这对您有所帮助。

查询到
firebase
是一个异步操作,因此您必须哭到操作完成才能获得正确的数据。此外,您已经在
onDataChange
之外提交了当前编辑器。因此,您必须在
onDataChange内部再次启动编辑器以解决此问题。请检查以下内容:

@Override
public void onDataChange(DataSnapshot dataSnapshot) {
    User user1=null;
    //Check if user not exist in database
    if (dataSnapshot.child(user.getUid()).exists()) {

        user1 = dataSnapshot.child(user.getUid()).getValue(User.class);

        //   user_tbl.removeEventListener(this);
    }

    SharedPreferences.Editor editor2 = settings.edit();
    editor2.putString("username", user1.getUserName());
    editor2.apply();
}

查询
firebase
是一个异步操作,因此您必须等待操作完成才能获得正确的数据。此外,您已经在
onDataChange
之外提交了当前编辑器。因此,您必须在
onDataChange
内部再次启动编辑器才能解决此问题。请检查以下内容:

@Override
public void onDataChange(DataSnapshot dataSnapshot) {
    User user1=null;
    //Check if user not exist in database
    if (dataSnapshot.child(user.getUid()).exists()) {

        user1 = dataSnapshot.child(user.getUid()).getValue(User.class);

        //   user_tbl.removeEventListener(this);
    }

    SharedPreferences.Editor editor2 = settings.edit();
    editor2.putString("username", user1.getUserName());
    editor2.apply();
}

您是否调试以检查是否
user1.getUserName()
返回任何值?OnData内部的是更改了其返回的正确用户名。但当我尝试从外部方法或其他活动访问时,它向firebase抛出NullQuery是异步操作,因此您必须哀号直到完成操作。您是否调试以检查
user1.getUserName()
返回任何值?是的,OnData内部更改了其返回的正确用户名。但是,当我尝试从外部方法或其他活动访问时,它向firebase抛出null查询是异步操作,因此您必须哀号直到完成操作。真的很好。它工作得很有魅力,感谢解决方案@Md asaduzzaman真的很好。它很有魅力谢谢你的解决方案@Md Asaduzzaman