在片段上的getCurrentUser()。getUid()上获取空对象引用

时间:2019-01-13 16:46:39

标签: android android-fragments firebase-authentication

我正在创建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会收到该用户,但在那里是没有,然后应用程序崩溃了……这里的问题是为什么应用程序首先打开该片段,然后再验证应先打开哪个活动

1 个答案:

答案 0 :(得分:1)

根据文档,您应该先检查用户当前是否登录,然后再获取用户ID:https://firebase.google.com/docs/reference/android/com/google/firebase/auth/FirebaseAuth.html#getCurrentUser()