• 内部类中调用外部变量


    下面是一段firebase上的用于获取当前token的代码,我需要把这个token获取然后返回给外面使用,并封装成一个方法

    FirebaseMessaging.getInstance().getToken()
        .addOnCompleteListener(new OnCompleteListener<String>() {
            @Override
            public void onComplete(@NonNull Task<String> task) {
              if (!task.isSuccessful()) {
                Log.w(TAG, "Fetching FCM registration token failed", task.getException());
                return;
              }
    
              // Get new FCM registration token
              String token = task.getResult();
    
              // Log and toast
              String msg = getString(R.string.msg_token_fmt, token);
              Log.d(TAG, msg);
              Toast.makeText(MainActivity.this, msg, Toast.LENGTH_SHORT).show();
            }
        });
    

    封装之后

    /**
         * 获取当前FirebaseToken
         * @return
         */
        public String getFirebaseToken(){
            String token = "";
            FirebaseMessaging.getInstance().getToken()
                    .addOnCompleteListener(new OnCompleteListener<String>() {
                        @Override
                        public void onComplete(@NonNull Task<String> task) {
                            if (!task.isSuccessful()) {
                                Log.w("firebase_token", "Fetching FCM registration token failed", task.getException());
                                return ;
                            }
    
                            // Get new FCM registration token
                            token = task.getResult();
    
                            // Log and toast
                            Log.d("firebase_token", token.toString());
                            Toast.makeText(MCApiFactoryControl.getInstance().getContext(), token, Toast.LENGTH_SHORT).show();
                        }
                    });
    
            return token;
        }
    

    错误信息


    1. Variable 'token' is accessed from within inner class, needs to be final or effectively final

    这个信息里面已经提示的很详细了,不能在内部类中赋值外部的变量,所以需要加一个final修饰token

    之后就会出现新的报错
    2. Cannot assign a value to final variable 'token'
    不能在final修饰的变量赋值之后重新赋值。

    这个我记得String是个对象,所以以为final只是固定了对象的地址不变,忘记了String不可以重新赋值。
    所以将String替换为StringBuffer,并使用append方法进行赋值。

    /**
         * 获取当前FirebaseToken
         * @return
         */
        public String getFirebaseToken(){
            final StringBuffer token = new StringBuffer("");
            FirebaseMessaging.getInstance().getToken()
                    .addOnCompleteListener(new OnCompleteListener<String>() {
                        @Override
                        public void onComplete(@NonNull Task<String> task) {
                            if (!task.isSuccessful()) {
                                Log.w("firebase_token", "Fetching FCM registration token failed", task.getException());
                                return ;
                            }
    
                            // Get new FCM registration token
                            token.append(task.getResult());
    
                            // Log and toast
                            Log.d("firebase_token", token.toString());
                            Toast.makeText(MCApiFactoryControl.getInstance().getContext(), token, Toast.LENGTH_SHORT).show();
                        }
                    });
    
            return token.toString();
        }
    
  • 相关阅读:
    [leetcode] 17. 电话号码的字母组合
    C++17 Fold Expressions
    多线程----NSOperation
    CGD---1--开辟并发新线程
    彻底解决_OBJC_CLASS_$_某文件名", referenced from:问题(转)
    ios 内存使用陷阱 和imageNamed 、imageWithContentsOfFile:(转)
    (转)unbalanced calls to begin/end appearance transitions for uiviewcontroller的解决方法
    ios开发种证书
    使用CAShapeLayer与UIBezierPath画出想要的图形
    定位子字符串的位置
  • 原文地址:https://www.cnblogs.com/charlottepl/p/16408336.html
Copyright © 2020-2023  润新知