【问题标题】:Create callback Class创建回调类
【发布时间】:2023-01-15 16:19:20
【问题描述】:

嘿,我正在使用调用 PhoneAuthProvider 的 firebase 回调 我想要做的是将这个回调包装在类中,并在多个类中创建此类的实例,而不是多次编写此回调(尝试编写'clean 代码') 我可以吗? 我还想为函数添加参数 我怎样才能做到这一点?

    private final PhoneAuthProvider.OnVerificationStateChangedCallbacks
            mCallbacks = new PhoneAuthProvider.OnVerificationStateChangedCallbacks() {

        @Override
        public void onVerificationCompleted(@NonNull PhoneAuthCredential credential) {
            final String code = credential.getSmsCode();
            if (code != null) {
                verifycode(code);
            }
        }

        @Override
        public void onVerificationFailed(@NonNull FirebaseException e) {
        }

        @Override
        public void onCodeSent(@NonNull String s,
                               @NonNull PhoneAuthProvider.ForceResendingToken token) {
            super.onCodeSent(s, token);
            verificationID = s;
/*
            Toast.makeText(RegistrationActivity.this, "Code sent", Toast.LENGTH_SHORT).show();
*/
          /*  btnJoinNl.setEnabled(true);
            codeFunc(s);*/
/*
            bar.setVisibility(View.INVISIBLE);
*/
        }


   };

【问题讨论】:

    标签: java android firebase callback asynccallback


    【解决方案1】:

    您可以简单地将构造移动到一个将从不同地方调用的方法。然后实例的实际构造只写了一次(但调用了很多次)。

    但也可以将它写成一个独立的类。通常您的 IDE(例如 IntelliJ、Eclipse)将此转换作为其“重构”操作的一部分提供。结果如下所示:

    public class MyCallback extends PhoneAuthProvider.OnVerificationStateChangedCallbacks {
        private String verificationID;
    
        public String getVerificationID() {
            return verificationID;
        }
    
        @Override
        public void onVerificationCompleted(@NonNull PhoneAuthCredential credential) {
            final String code = credential.getSmsCode();
            if (code != null) {
                verifycode(code);
            }
        }
    
        @Override
        public void onVerificationFailed(@NonNull FirebaseException e) {
        }
    
        @Override
        public void onCodeSent(@NonNull String s,
                               @NonNull PhoneAuthProvider.ForceResendingToken token) {
            super.onCodeSent(s, token);
            verificationID = s;
        }
    
        private void verifyCode(final String code) {
            // verify ...
        }
    }
    

    根据要求,您可以通过以下方法创建实例:

    private final PhoneAuthProvider.OnVerificationStateChangedCallbacks
            mCallbacks = createCallback();
    
    private PhoneAuthProvider.OnVerificationStateChangedCallbacks createCallBack() {
        return new PhoneAuthProvider.OnVerificationStateChangedCallbacks() {
            /* override methods here ... */
        };
    }
    

    两种变体都可以组合,因此您可以先提取一个类,然后用一个方法创建该类的实例。

    【讨论】:

    • 非常感谢你,你能用方法解释第一个解决方案吗?
    • @NMZ 不要直接用yourvar = new … 给变量赋值,而是把new 表达式块移动到一个方法中,然后调用方法:yourvar = methodCall()。方法实现为return new …
    • 你能写一个这样的例子吗?
    • @NMZ 完成了。虽然我建议在方法难以理解的情况下避免使用匿名类和回调对象。使用更简单的命令行程序启动速度较慢。
    猜你喜欢
    • 2018-12-18
    • 2016-08-08
    • 1970-01-01
    • 1970-01-01
    • 2019-10-29
    • 2015-03-19
    • 1970-01-01
    • 1970-01-01
    • 2021-02-10
    相关资源
    最近更新 更多