android - 如何在方法void中初始化最终变量布尔数组
问题描述
我的应用程序将检查播放保护设置是否已激活。
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;
}
在这种情况下,我尝试将最终结果记录下来,但在记录结果中始终未激活,如何获得良好的结果来检查 play prtoect 是否处于活动状态?
解决方案
该isVerifyAppsEnabled()
方法是异步的,它调用OnCompleteListener
'onComplete
方法来通知结果何时准备好。
该块很可能在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()
推荐阅读
- amazon-web-services - 如何将本地 dynamodb 实例(包括所有文件)部署到 AWS?
- corda - 我们可以使用 SGX 的 enclave 在 Corda 中执行流程吗?
- shell - 如何删除一行中的特殊空格?
- windows - VS 2017 商店“创建应用程序包”已禁用
- c# - ReactiveUI 命令绑定 + 资源中的 ContextMenu =?
- javascript - Javascript 中的参考 ID 只知道其中的一部分
- javascript - 使 div 可选
- javascript - 从 CDN 提供 javascript 库与将它们组合为一个并用作单个 http 连接
- java - 无法解决对构造函数的动态引用
- c# - C# 使用反射列出 FindAll