为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

墨色风雨 2021-10-17 17:03:54
我正在尝试使用接口异步检查 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) {        }    });}
查看完整描述

1 回答

?
慕虎7371278

TA贡献1802条经验 获得超4个赞

这是一个解释。首先,field变量是variable在 内部创建的,class并且可以被该 的所有成员访问class。在variablea 内部创建的另一侧method只能由该方法的成员访问,而不能由class.

Firebase 异步运行(读取和写入数据库)并实现自己的callbacks,在 UI 线程上调用。例如,您可以实现的回调之一(取决于场景)是:onSuccessListeneraddOnFailureListeneronCompleteListeneronDataChange。这callbacks为您提供来自 Firebase(在本例中为数据库)的信息,要么写入成功,要么读取成功,并且您的数据已准备好在应用程序中使用或出现问题。在这些中,callbacks您可以轻松更新您的 UI。

您现在正在做的是创建一个interface将在触发时callbacks触发的操作,这是一个不必要的步骤,因为您可以callback直接在其中轻松更新 UI 。

您在要返回用户名的位置创建的方法也不会按预期工作。为什么?因为部分代码return fetchedusername在从数据库返回结果之前执行。如您所知Fireabse,异步运行,需要通过互联网获取数据,同时return fetchedusername已经执行。这就是为什么你有callback方法。

希望这可以清除一些事情。


查看完整回答
反对 回复 2021-10-17
  • 1 回答
  • 0 关注
  • 145 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号