内部类中调用外部变量

下面是一段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();
    }
posted @ 2022-06-24 12:04  两小无猜  阅读(224)  评论(1编辑  收藏  举报