我有一个片段,根据一天中的时间和星期几在textview中打印一条消息。我想打印登录的名字,但如果用户注销,则应忽略该名字。 登录后应用程序运行正常,但我尝试调用虚拟方法' java.lang.String com.google.firebase.auth.FirebaseUser.getUid()'我在注销时在空对象引用上。
String userID;
String currentUserId;
FirebaseAuth mAuth;
String mDayGreet;
String weekDay;
DatabaseReference dbReference = FirebaseDatabase.getInstance().getReference();
public static final String USER_ID_EXTRA_KEY = "EXTRA_KEY";
userID = getActivity().getIntent().getStringExtra(USER_ID_EXTRA_KEY);
mAuth = FirebaseAuth.getInstance();
FirebaseUser firebaseUser = FirebaseAuth.getInstance().getCurrentUser();
if (firebaseUser!= null) {
currentUserId = firebaseUser.getUid();
}
dbReference.child("AllUsers").child(FirebaseAuth.getInstance().getCurrentUser().getUid()).child("profile").addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
User userDetail = dataSnapshot.getValue(User.class);
Calendar mCalendar = Calendar.getInstance();
SimpleDateFormat mFormatDate = new SimpleDateFormat("HH");
String mDateString = mFormatDate.format(mCalendar.getTime());
int time = Integer.parseInt(mDateString);
TextView greeting = view.findViewById(R.id.greeting);
int dayOfWeek = mCalendar.get(Calendar.DAY_OF_WEEK);
TextView dayInfo = view.findViewById(R.id.info);
if (Calendar.MONDAY == dayOfWeek) {
if (time >= 0 && time < 18) {
weekDay = getString(R.string.monday);
}
}
dayInfo.setText(weekDay);
if (time >= 0 && time < 12)
if (currentUserId == null) {
mDayGreet = getString(R.string.morning);
} else {
mDayGreet = getString(R.string.morning) + " " + userDetail.getFirstName();
}
greeting.setText(mDayGreet);
答案 0 :(得分:0)
您正在使用FirebaseAuth.getInstance().getCurrentUser().getUid()
作为child
数据库引用方法的参数。但是当用户未登录时,语句FirebaseAuth.getInstance().getCurrentUser()
将返回null,并且当您尝试在其上调用方法时,最终将获得NullPointerException
。
一种解决方案是在用户登录时将用户ID保存在共享首选项中,如果用户下次未登录,则可以从共享首选项而不是FirebaseAuth
获取用户ID