Java Firebase会话管理:安装全局用户的问题
我是一名Android Studio编程初学者,目前正在开发一款营养品应用程序来进行编程练习。我使用Firebase进行身份验证,并将其用作保存用户数据的数据库 工作原理: 我的应用程序有一个内置的调查,询问身体细节和口味(年龄、身高、喜欢/不喜欢的成分等)。我有一个带有公共静态属性的GlobalUser类,可以将答案保存在应用程序中。用户注册后,将直接发送到调查活动。在那里,他回答了问题,结果在他的UID下写入Firebase数据库(我使用与GlobalUser具有相同属性的用户类创建实例,并使用Firebase的setValue(Object)方法)。如果他登录(或仍然登录),LoginRegistrationActivity会直接将他发送到MainActivity。在那里,GlobalUser类将使用保存在其UID下的数据进行实例化。从MainActivity,他可以导航到ProfileActivity,其中UI会根据他的数据进行更新。这很有效。完成调查后,我可以在由用户UID组成的子节点中找到结果,UI得到正确更新,登录/注册过程按预期工作 怎么了: 然而,当我使用不同的设计并不断重启应用程序时,它偶尔会崩溃。经过一些测试,它显示GlobalUser类没有更新,因此ArrayList为null,并且在我对其使用.size()时导致了NullPointerException。由于这个问题很少发生,而且似乎与多次重启应用程序有关,我认为这与活动生命周期有关,所以我也在onStart和onResume中更新了GlobalUser,但没有帮助。在设置ArrayList之前,我还尝试在ProfileActivity中再次更新GlobalUser,但没有成功。我仍然认为这与生命周期有关,但我不知道应该从哪里开始。以下是相关课程/活动的代码: 登录注册活动:Java Firebase会话管理:安装全局用户的问题,java,android,firebase,session,authentication,Java,Android,Firebase,Session,Authentication,我是一名Android Studio编程初学者,目前正在开发一款营养品应用程序来进行编程练习。我使用Firebase进行身份验证,并将其用作保存用户数据的数据库 工作原理: 我的应用程序有一个内置的调查,询问身体细节和口味(年龄、身高、喜欢/不喜欢的成分等)。我有一个带有公共静态属性的GlobalUser类,可以将答案保存在应用程序中。用户注册后,将直接发送到调查活动。在那里,他回答了问题,结果在他的UID下写入Firebase数据库(我使用与GlobalUser具有相同属性的用户类创建实例,并
public class LoginRegistrationActivity extends AppCompatActivity {
private DatabaseReference mRef;
private FirebaseAuth mAuth;
private EditText emailAddress;
private EditText emailPassword;
private Button emailLogin;
private Button emailRegistration;
private TextView forgotPassword;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login_registration);
mAuth = FirebaseAuth.getInstance();
if (mAuth.getCurrentUser()!=null){
Intent i = new Intent (LoginRegistrationActivity.this, MainActivity.class);
LoginRegistrationActivity.this.startActivity(i);
}
emailAddress = findViewById(R.id.address_edit);
emailPassword = findViewById(R.id.password_edit);
emailLogin = findViewById(R.id.mail_login_button);
emailRegistration = findViewById(R.id.mail_registration_button);
forgotPassword = findViewById(R.id.forgot_password);
emailRegistration.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
String email = emailAddress.getText().toString().trim();
String password = emailPassword.getText().toString().trim();
if (TextUtils.isEmpty(email)){
Toast.makeText(LoginRegistrationActivity.this, "Bitte E-Mail Addresse eingeben!", Toast.LENGTH_LONG).show();
return;
}
if (TextUtils.isEmpty(password)){
Toast.makeText(LoginRegistrationActivity.this, "Bitte Passwort eingeben!", Toast.LENGTH_LONG).show();
return;
}
if (password.length()<6){
Toast.makeText(LoginRegistrationActivity.this, "Passwort muss mindestens sechs Zeichen lang sein!", Toast.LENGTH_LONG).show();
return;
}
mAuth.createUserWithEmailAndPassword(email, password).addOnCompleteListener(LoginRegistrationActivity.this, new OnCompleteListener<AuthResult>() {
@Override
public void onComplete(@NonNull Task<AuthResult> task) {
if (!task.isSuccessful()){
Toast.makeText(LoginRegistrationActivity.this, "Unbekannter Fehler", Toast.LENGTH_LONG).show();
} else {
Intent i = new Intent (LoginRegistrationActivity.this, SurveyGreetingActivity.class);
LoginRegistrationActivity.this.startActivity(i);
finish();
}
}
});
}
});
emailLogin.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
String password = emailPassword.getText().toString();
String email = emailAddress.getText().toString();
if (TextUtils.isEmpty(email)){
Toast.makeText(LoginRegistrationActivity.this, "Bitte E-Mail Addresse eingeben!", Toast.LENGTH_LONG).show();
return;
}
if (TextUtils.isEmpty(password)){
Toast.makeText(LoginRegistrationActivity.this, "Bitte Passwort eingeben!", Toast.LENGTH_LONG).show();
return;
}
if (password.length()<6){
Toast.makeText(LoginRegistrationActivity.this, "Passwort muss mindestens sechs Zeichen haben!", Toast.LENGTH_LONG).show();
return;
}
mAuth.signInWithEmailAndPassword(email, password).addOnCompleteListener(LoginRegistrationActivity.this, new OnCompleteListener<AuthResult>() {
@Override
public void onComplete(@NonNull Task<AuthResult> task) {
if (!task.isSuccessful()){
Toast.makeText(LoginRegistrationActivity.this, "Unbekannter Fehler beim Einloggen", Toast.LENGTH_LONG).show();
} else {
Intent i = new Intent (LoginRegistrationActivity.this, MainActivity.class);
LoginRegistrationActivity.this.startActivity(i);
finish();
}
}
});
}
});
}
}
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
final FirebaseAuth mAuth = FirebaseAuth.getInstance();
FirebaseUser user = mAuth.getCurrentUser();
FirebaseDatabase database = FirebaseDatabase.getInstance();
DatabaseReference mRef = database.getReference().child("users").child("uid").child(mAuth.getCurrentUser().getUid());
//In case the user cancelled the app when filling out the survey for the first time
if (mRef == null){
MainActivity.this.startActivity(new Intent (MainActivity.this, SurveyGreetingActivity.class));
}
//sets GlobalUser to data saved in Firebase Database User object
mRef.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
User user = dataSnapshot.getValue(User.class);
if (user!=null){
GlobalUser.setToUser(user);
GlobalUser.setGlobalUid(mAuth.getCurrentUser().getUid());
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
Toast.makeText(getApplicationContext(), "Database Error", Toast.LENGTH_LONG).show();
}
});
}
}
GlobalUser:
package com.example.andre.valetto02;
import java.util.ArrayList;
public class GlobalUser {
public static String globalUid = null;
public static ArrayList<Ingredient> globalLikes;
public static ArrayList<Ingredient> globalDislikes;
public static int globalAge;
public static int globalWeight;
public static int globalHeight;
public static int globalTrainingGoal;
public static int globalDailyActive;
public static boolean globalIsMale;
public GlobalUser() {
}
public static String getGlobalUid() {
return globalUid;
}
public static void setGlobalUid(String globalUid) {
GlobalUser.globalUid = globalUid;
}
public static ArrayList<Ingredient> getGlobalLikes() {
return globalLikes;
}
public static void setGlobalLikes(ArrayList<Ingredient> globalLikes) {
GlobalUser.globalLikes = globalLikes;
}
public static ArrayList<Ingredient> getGlobalDislikes() {
return globalDislikes;
}
public static void setGlobalDislikes(ArrayList<Ingredient> globalDislikes) {
GlobalUser.globalDislikes = globalDislikes;
}
public static int getGlobalAge() {
return globalAge;
}
public static void setGlobalAge(int globalAge) {
GlobalUser.globalAge = globalAge;
}
public static int getGlobalWeight() {
return globalWeight;
}
public static void setGlobalWeight(int globalWeight) {
GlobalUser.globalWeight = globalWeight;
}
public static int getGlobalHeight() {
return globalHeight;
}
public static void setGlobalHeight(int globalHeight) {
GlobalUser.globalHeight = globalHeight;
}
public static int getGlobalTrainingGoal() {
return globalTrainingGoal;
}
public static void setGlobalTrainingGoal(int globalTrainingGoal) {
GlobalUser.globalTrainingGoal = globalTrainingGoal;
}
public static int getGlobalDailyActive() {
return globalDailyActive;
}
public static void setGlobalDailyActive(int globalDailyActive) {
GlobalUser.globalDailyActive = globalDailyActive;
}
public static boolean isGlobalIsMale() {
return globalIsMale;
}
public static void setGlobalIsMale(boolean globalIsMale) {
GlobalUser.globalIsMale = globalIsMale;
}
public static void setToUser(User user) {
GlobalUser.setGlobalAge(user.getAge());
GlobalUser.setGlobalWeight(user.getWeight());
GlobalUser.setGlobalHeight(user.getHeight());
GlobalUser.setGlobalDailyActive(user.getDailyActive());
GlobalUser.setGlobalTrainingGoal(user.getTrainingGoal());
GlobalUser.setGlobalIsMale(user.getIsMale());
GlobalUser.setGlobalLikes(user.getLikes());
GlobalUser.setGlobalDislikes(user.getDislikes());
}
public static void resetLikesAndDislikes(){
globalLikes = new ArrayList <>();
globalDislikes = new ArrayList<>();
}
public static User globalToUser () {
return new User (globalLikes, globalDislikes, globalWeight, globalHeight, globalAge, globalTrainingGoal, globalDailyActive, globalIsMale);
}
}
package com.example.andre.valetto02;
导入java.util.ArrayList;
公共类GlobalUser{
公共静态字符串globalUid=null;
公共静态数组列表globalLikes;
公共静态阵列列表globaldislike;
全球范围内的公共静态信息;
公共静态整数全局权重;
公共静态int全球高度;
公共静态int全球培训目标;
公共静态int globalDailyActive;
公共静态分析;
公共GlobalUser(){
}
公共静态字符串getGlobalUid(){
返回globalUid;
}
公共静态void setGlobalUid(字符串globalUid){
GlobalUser.globalUid=globalUid;
}
公共静态数组列表getGlobalLikes(){
返回globalLikes;
}
公共静态无效集合globalLikes(ArrayList globalLikes){
GlobalUser.globalLikes=globalLikes;
}
公共静态数组列表getGlobalDislikes(){
返回全球岛屿;
}
公共静态无效集合globalDislikes(数组列表globalDislikes){
GlobalUser.globalDislikes=globalDislikes;
}
公共静态int getGlobalAge(){
返回全局;
}
公共静态无效集globalAge(int globalAge){
GlobalUser.globalAge=globalAge;
}
公共静态int getGlobalWeight(){
返回总重量;
}
公共静态无效设置globalWeight(int globalWeight){
GlobalUser.globalWeight=全局权重;
}
公共静态int getGlobalHeight(){
返回全局高度;
}
公共静态无效setGlobalHeight(int globalHeight){
GlobalUser.globalHeight=globalHeight;
}
公共静态int getGlobalTrainingGoal(){
回归全球训练目标;
}
公共静态无效设置globalTrainingGoal(int globalTrainingGoal){
GlobalUser.globalTrainingGoal=globalTrainingGoal;
}
公共静态int getGlobalDailyActive(){
返回全局DailyActive;
}
公共静态无效setGlobalDailyActive(int globalDailyActive){
GlobalUser.globalDailyActive=globalDailyActive;
}
公共静态布尔值(){
回归男性;
}
公共静态无效集合globalismeal(布尔globalismeal){
GlobalUser.globalIsMale=globalIsMale;
}
公共静态无效设置器(用户){
setGlobalAge(user.getAge());
setGlobalWeight(user.getWeight());
setGlobalHeight(user.getHeight());
GlobalUser.setGlobalDailyaActivity(user.getDailayActive());
setGlobalTrainingGoal(user.getTrainingGoal());
setGlobalIsMale(user.getIsMale());
setGlobalLikes(user.getLikes());
GlobalUser.setGlobalDislikes(user.getDislikes());
}
public static void resetlikes和dislikes(){
globalLikes=newarraylist();
globalDislikes=newarraylist();
}
公共静态用户globalToUser(){
返回新用户(globalLikes、GlobalIslikes、globalWeight、globalHeight、globalAge、globalTrainingGoal、globalDailyActive、GlobalMale);
}
}
用户:
package com.example.andre.valetto02;
导入java.util.ArrayList;
公共类用户{
ArrayList喜欢;
ArrayList不喜欢;
布尔isMale;
公共布尔getIsMale(){return isMale;}
public void setIsMale(Boolean b){isMale=b;}
public void setDislikes(arraylistdislikes){
这个。不喜欢=不喜欢;
}
公共用户(){
likes=newarraylist();
不喜欢=新的ArrayList();
权重=0;
高度=0;
年龄=0;
培训目标=2;
dailyActive=1;
isMale=true;
}
公共用户(ArrayList l、ArrayList d、int w、int h、int a、int tG、int dA、布尔iM){
likes=l;
迪塞尔
package com.example.andre.valetto02;
import java.util.ArrayList;
public class User {
ArrayList<Ingredient> likes;
ArrayList<Ingredient> dislikes;
Boolean isMale;
public Boolean getIsMale(){return isMale;}
public void setIsMale(Boolean b){isMale = b;}
public void setDislikes(ArrayList<Ingredient> dislikes) {
this.dislikes = dislikes;
}
public User (){
likes = new ArrayList<>();
dislikes = new ArrayList<>();
weight = 0;
height = 0;
age = 0;
trainingGoal = 2;
dailyActive = 1;
isMale=true;
}
public User (ArrayList<Ingredient> l, ArrayList<Ingredient> d, int w, int h, int a, int tG, int dA, boolean iM) {
likes = l;
dislikes = d;
weight = w;
height = h;
age = a;
trainingGoal = tG;
dailyActive = dA;
isMale = iM;
}
int age;
public ArrayList<Ingredient> getDislikes() {
return dislikes;
}
public ArrayList<Ingredient> getLikes() {
return likes;
}
public void setLikes (ArrayList<Ingredient> list){
likes = list;
}
public void setDisikes (ArrayList<Ingredient> list){
dislikes = list;
}
public int getAge () {
return age;
}
public void setAge (int i) {
age = i;
}
int weight;
public int getWeight (){
return weight;
}
public void setWeight(int i) {
weight = i;
}
int height;
public int getHeight (){
return height;
}
public void setHeight(int i) {
height = i;
}
int trainingGoal; //trainingGoal = 0 means weight loss, 1 means muscle gain and 2 means healthy living
public void setTrainingGoal(int i) {
trainingGoal = i;
}
public int getTrainingGoal(){
return trainingGoal;
}
int dailyActive; //dailyActive = 0 means wenig, 1 means leicht, 2 means moderat, 3 means sehr and 4 means extrem
public int getDailyActive() {return dailyActive;}
public void setDailyActive(int i) {dailyActive = i;}
public double computeCalorieGoal(){
if (isMale) {
double RMR;
RMR = weight*10 + 6.25*height - 5*age + 5;
if (dailyActive==0) {RMR=RMR*1.2;}
else if (dailyActive==1) {RMR=RMR*1.375;}
else if (dailyActive==2) {RMR=RMR*1.55;}
else if (dailyActive==3) {RMR=RMR*1.725;}
else {RMR=RMR*1.9;}
if (trainingGoal == 0) {RMR = RMR - 400;}
else if (trainingGoal ==1){RMR = RMR + 400;}
return RMR;
} else {
double RMR;
RMR = weight*10 + 6.25*height - 5*age - 161;
if (dailyActive==0) {RMR=RMR*1.2;}
else if (dailyActive==1) {RMR=RMR*1.375;}
else if (dailyActive==2) {RMR=RMR*1.55;}
else if (dailyActive==3) {RMR=RMR*1.725;}
else {RMR=RMR*1.9;}
if (trainingGoal == 0) {RMR = RMR - 300;}
else if (trainingGoal ==1){RMR = RMR + 300;}
return RMR;
}
}
}
if (mAuth.getCurrentUser()!=null){
FirebaseDatabase firebaseDatabase = FirebaseDatabase.getInstance();
DatabaseReference mRef = firebaseDatabase.getReference().child("users").child("uid").child(mAuth.getCurrentUser().getUid());
//In case the user cancelled the app when filling out the survey for the first time
if (mRef == null){
LoginRegistrationActivity.this.startActivity(new Intent (LoginRegistrationActivity.this, SurveyGreetingActivity.class));
}
mRef.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
User user = dataSnapshot.getValue(User.class);
if (user!=null) {
GlobalUser.setToUser(user);
GlobalUser.setGlobalUid(mAuth.getCurrentUser().getUid());
}
Intent i = new Intent (LoginRegistrationActivity.this, MainActivity.class);
LoginRegistrationActivity.this.startActivity(i);
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
}