【问题标题】:how to initialize final variable boolean array in method void如何在方法void中初始化最终变量布尔数组
【发布时间】:2019-04-18 03:20:07
【问题描述】:

我的应用程序将检查播放保护设置是否已激活。

public static boolean checkGooglePlayProtectSettings(Context context){
    final boolean[] enabled = new boolean[]{false};
    try{
        SafetyNet.getClient(context).isVerifyAppsEnabled().addOnCompleteListener(new OnCompleteListener<SafetyNetApi.VerifyAppsUserResponse>() {

            @Override
                    public void onComplete(@NonNull Task<SafetyNetApi.VerifyAppsUserResponse> task) {
                        if(task.isSuccessful()){
                            SafetyNetApi.VerifyAppsUserResponse result = task.getResult();
                            if(result != null){
                                if(result.isVerifyAppsEnabled()){
                                    enabled[0] = true;
                                }else{
                                    enabled[0] = false;

                                }
                            }
                        }else{
                            Log.e("GoogleProtectPermission", "A general error occurred.");
                        }
                    }
                });
    }catch (Exception e){
        e.printStackTrace();
    }

    if (enabled[0]){
        Log.d("GoogleProtectPermission", "Is enabled");
    }else {
        Log.d("GoogleProtectPermission", "Is disabled");
    }
    return false;
}

在这种情况下,我尝试将最终结果记录下来,但在记录结果中总是不活动,如何获得好的结果来检查播放保护是否处于活动状态?

【问题讨论】:

    标签: android android-studio boolean


    【解决方案1】:

    isVerifyAppsEnabled() 方法是异步的,它调用OnCompleteListeneronComplete 方法来通知结果何时准备好。

    很可能此块在OnCompleteListener 被触发之前执行,因此enabled[0] 的值此时保持不变。

    if (enabled[0]) {
        Log.d("GoogleProtectPermission", "Is enabled");
    } else {
        Log.d("GoogleProtectPermission", "Is disabled");
    }
    

    由于没有同步方法来获取结果,您可能必须以某种方式更改您的方法以考虑这种异步性并在回调结果准备好时执行相关操作或执行阻塞等待直到 Task 返回由isVerifyAppsEnabled 完成。

    另外,不管这个问题,在您当前的代码中,使用布尔数组而不是仅仅使用布尔值似乎没什么意义,而这个

    if(result.isVerifyAppsEnabled()) {
        enabled[0] = true;
    } else {
        enabled[0] = false;
    }
    

    可以简化成这个enabled[0] = result.isVerifyAppsEnabled()

    【讨论】:

      【解决方案2】:

      你可以这样做:

      final StringBuilder sb = new StringBuilder();
      ...
      if(result.isVerifyAppsEnabled()){
          sb.append("good");
      }else{
          sb.append("bad");
      }
      ...
      if(sb.toString().equals("good")){
          Log.d("GoogleProtectPermission", "Is enabled");
      }
      if(sb.toString().equals("bad")){
          Log.d("GoogleProtectPermission", "Is disabled");
      }
      

      已编辑: 是的,正如评论点,我的回答是错误的。所以有两种方法:

      1直接输出日志信息

         if(result.isVerifyAppsEnabled()){
             Log.d("GoogleProtectPermission", "Is enabled");
          }else{
              Log.d("GoogleProtectPermission", "Is disabled");
          }
      

      2 使用接口回调

         public interface Callback {  //add an interface 
              void onResponse(String message);
          }
      
          final StringBuilder sb = new StringBuilder();
          ...
          if(result.isVerifyAppsEnabled()){
              sb.append("good");
          }else{
              sb.append("bad");
          }
          callback.onResponse(sb.toString()); //add this line
      

      并在某个地方订阅界面。

      【讨论】:

      • 由于isVerifyAppsEnabled() 方法的异步特性,这将不起作用。并且使用Strings 和StringBuilders 而不是boolean 值是bad practice,它会创建许多不必要的对象,执行许多不需要的操作,缺乏类型安全性和编译检查以及 it 不应该 完成 全部。实际上有一个术语 - Stringly Typed
      • @MikhailOlshanski 是的,你是对的,我修改答案,谢谢!
      猜你喜欢
      • 2019-01-16
      • 1970-01-01
      • 1970-01-01
      • 2019-07-12
      • 2016-10-02
      • 1970-01-01
      • 2014-08-23
      • 1970-01-01
      • 2016-12-27
      相关资源
      最近更新 更多