如何在按钮的onClickListener内时从实时数据库中获取数据

时间:2018-12-23 09:13:52

标签: android firebase-realtime-database onclicklistener

我正在构建一个应用,并试图在用户按下按钮后立即立即获取数据。但是,直到onClickListener的onComplete完成之后,数据获取部分才发生。在onComplete完成之前,我需要访问数据。

现在,我的片段包含一个电子邮件和密码字段,他们将其填写并按下“登录”按钮。我在登录按钮上设置了一个onClickListener,在其中调用了FirebaseAuth's signInWithEmailandPassword方法。这将返回AuthResult任务,我将onCompleteListener设置为该任务。

如果此任务成功,我将触发一个addListenerForSingleValueEvent()任务,以从Firebase实时数据库中获取相关用户的数据。似乎此任务在onComplete方法之后运行。我该如何改变?我尝试为此使用AsyncTask,但结果是相同的。

我的LoginFragment:

mLogInButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(final View v) {
            String email = mEmailText.getText().toString();
            String password = mPasswordText.getText().toString();
            final boolean[] loginSuccess = {false};

            Task task = mViewModel.signIn(email, 
password).addOnCompleteListener
                    (new OnCompleteListener() {
                @Override
                public void onComplete(@NonNull Task task) {
                    if (task.isSuccessful()) {
                        Log.d(TAG, "signInWithEmail:success");
                        Toast.makeText(getActivity(),
                                "Signed in!", 
Toast.LENGTH_SHORT).show();
                        loginSuccess[0] = true;
                        String uid = mViewModel.getAuth().getUid();
                        mViewModel.fetchUser(uid);
                        Log.d(TAG, mViewModel.getUser().getName());

                    } else {
                        Log.w(TAG, "signInWithEmail:failure", 
task.getException());
                        Toast.makeText(getActivity(), "Auth failed. 
Check log!",
                                Toast.LENGTH_SHORT).show();
                        loginSuccess[0] = false;
                    }
                }
            });
            //Task fetchDatabase = task.addOnCompleteListener(new 
//OnCompleteListener() {
                //@Override
                //public void onComplete(@NonNull Task task) {
                //    Log.d(TAG, "After!");
              //  }
            //}); 
//                updateUIWithDatabaseDetails(mView);
        }
    });

我的fetchUser(uid)及其关联的ValueEventListener:

public void fetchUser(String uid) {
    mUserDatabase.child(uid).addListenerForSingleValueEvent(userDataValueListener);
}

public ValueEventListener userDataValueListener = new ValueEventListener() {
    @Override
    public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
        if (dataSnapshot.exists()) {
            Log.d(TAG, "User exists in remote!");
            mUser = dataSnapshot.getValue(User.class);
        }
        else {
            Log.d(TAG, "user doesn't exist.");
            mUser = null;
        }
    }

    @Override
    public void onCancelled(@NonNull DatabaseError databaseError) {
        Log.d(TAG, "Can't fetch Firebase Database user:" + databaseError.getMessage());
        mUser = null;
    }
};

当前设置立即由于Log.d(TAG, mViewModel.getUser().getName());处的NullPointerException而崩溃,因为数据库尚未提取用户并在SharedViewModel中更新了用户。

最底线:我认为在Login的onClick的onComplete完成后,数据库提取任务将排队执行。在onComplete运行时,有什么办法可以挤压这个任务?我当时在考虑使用Handler将其从UI线程中移出,但我不太了解它,因此确实需要一些指针。

任何帮助将不胜感激!

0 个答案:

没有答案