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