首页 > 解决方案 > 如何在方法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 是否处于活动状态?

标签: androidandroid-studioboolean

解决方案


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()


推荐阅读