我正在使用接口不正确地实现 ValueEventListener

我正在尝试使用接口异步检查 Firebase 数据库中的条目,但我不确定如何以与密码和电子邮件相同的方式实现它。


例子:


if (TextUtils.isEmpty(password) || !isPasswordValid(password)) {

            mPasswordView.setError(getString(R.string.error_invalid_password));

            focusView = mPasswordView;

            cancel = true;

        }


private boolean isPasswordValid(String password) {


        // Add logic to check for a valid password (minimum 8 characters)


        String confirmPassword = mConfirmPasswordView.getText().toString();

        return (confirmPassword.equals(password)) && (password.length() > 7) && (password != "12345678") && (password != "password");

    }

我正在尝试使用用户名创建一个类似的方法,用于检查 Firebase 中输入的用户名,然后在找到数据时返回 true。我创建了一个方法 (fetchUsername) 来在后台线程上检查 Firebase 中的名称,但无法弄清楚如何将结果正确传递回最终方法并返回一个布尔值。我相信我犯了一个愚蠢的语法错误,但我看不到。这是我所拥有的:


private boolean isUsernameDuplicate(final String username) {


    boolean userIsOnFirebase ( boolean isOnFirebase){ ///<----line that won't take, wants semicolon after variable

        if (isOnFirebase) {

            return true;

        } else {

            return false;

        }

    }


    fetchUsername(username, new FirebaseSuccessListener() {

        @Override

        public void onDataFound(boolean isDataFetched) {

            if (isDataFetched) {


                userIsOnFirebase(true);

            } else {

                userIsOnFirebase(false);

            }

        }

    });


    return userIsOnFirebase;

}



private void fetchUsername(final String username, final FirebaseSuccessListener dataFetched) {


    //checks database for username


    mReference = FirebaseDatabase.getInstance().getReference().child("users").child("username");

    mReference.addListenerForSingleValueEvent(new ValueEventListener() {

        @Override

        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {

            if (dataSnapshot.exists()) {


                dataFetched.onDataFound(true);

            }


        }


        @Override

        public void onCancelled(@NonNull DatabaseError databaseError) {


        }

    });


}


墨色风雨
浏览 146回答 1
1回答

慕虎7371278

这是一个解释。首先,field变量是variable在 内部创建的,class并且可以被该 的所有成员访问class。在variablea 内部创建的另一侧method只能由该方法的成员访问,而不能由class.Firebase 异步运行(读取和写入数据库)并实现自己的callbacks,在 UI 线程上调用。例如,您可以实现的回调之一(取决于场景)是:onSuccessListener、addOnFailureListener、onCompleteListener、onDataChange。这callbacks为您提供来自 Firebase(在本例中为数据库)的信息,要么写入成功,要么读取成功,并且您的数据已准备好在应用程序中使用或出现问题。在这些中,callbacks您可以轻松更新您的 UI。您现在正在做的是创建一个interface将在触发时callbacks触发的操作,这是一个不必要的步骤,因为您可以callback直接在其中轻松更新 UI&nbsp;。您在要返回用户名的位置创建的方法也不会按预期工作。为什么?因为部分代码return fetchedusername在从数据库返回结果之前执行。如您所知Fireabse,异步运行,需要通过互联网获取数据,同时return fetchedusername已经执行。这就是为什么你有callback方法。希望这可以清除一些事情。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java