我正在创建WhatsApp的克隆,并且在MainActivity上并排有4个片段:聊天,群组,联系人和请求。最后开发的是ChatsFragment。
在onCreateView上,它显示currentUserId = mAuth.getCurrentUser().getUid()
上的错误,错误为java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String com.google.firebase.auth.FirebaseUser.getUid()' on a null object reference
这是代码:
public class ChatsFragment extends Fragment {
private View privateChatsView;
private RecyclerView chatsList;
private DatabaseReference chatsRef, usersRef;
private FirebaseAuth mAuth;
private String currentUserId;
public ChatsFragment() {
// Required empty public constructor
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
privateChatsView = inflater.inflate(R.layout.fragment_chats, container, false);
mAuth = FirebaseAuth.getInstance();
currentUserId = mAuth.getCurrentUser().getUid();
usersRef = FirebaseDatabase.getInstance().getReference().child("Users");
chatsRef = FirebaseDatabase.getInstance().getReference().child("Contacts").child(currentUserId);
chatsList = privateChatsView.findViewById(R.id.chats_list);
chatsList.setLayoutManager(new LinearLayoutManager(getContext()));
return privateChatsView;
}
...
}
ContactsFragment使用相同的逻辑来显示用户的联系人,但是在单击它时不会崩溃,因此,我想知道ChatsFragment是否是MainActivity打开时第一个自动打开的联系人, ChatsFragment是否有可能在MainActivity之前先调用mAuth?还是我错过了什么?
如果同步存在此问题,如何延迟?
让我进一步说明,此错误始于第一部手机(API 23),第二部手机(API 21)正常,但现在也崩溃了。现在,该应用程序仅可在虚拟设备(API 27)上运行。希望对您有帮助
编辑/解决方案:正如我在验证davehenry所说的currentUser一样,其中一部手机刚刚挡住了屏幕,该应用程序运行良好。知道发生了什么,但是在手机被阻止的情况下打开应用程序时,取消阻止后,该应用程序位于登录页面上,此后运行良好。我尝试用另一部手机尝试并再次使用...应用程序可能有时间在MainActivity上验证currentUser,然后更改为LoginActivity,因为由于未登录,因此ChatsFragment会收到该用户,但在那里是没有,然后应用程序崩溃了……这里的问题是为什么应用程序首先打开该片段,然后再验证应先打开哪个活动
答案 0 :(得分:1)
根据文档,您应该先检查用户当前是否登录,然后再获取用户ID:https://firebase.google.com/docs/reference/android/com/google/firebase/auth/FirebaseAuth.html#getCurrentUser()