Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/heroku/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 任务API-如何将异步调用重构为同步调用,同时能够捕获所需的异常(ApiException)_Android_Google Play Services_Google Signin - Fatal编程技术网

Android 任务API-如何将异步调用重构为同步调用,同时能够捕获所需的异常(ApiException)

Android 任务API-如何将异步调用重构为同步调用,同时能够捕获所需的异常(ApiException),android,google-play-services,google-signin,Android,Google Play Services,Google Signin,目前,我使用任务API进行了以下异步调用 异步的 Task Task=googleSignInClient.silentSignIn(); 如果(!task.issusccessful()){ task.addOnCompleteListener(task1->{ //现在,这是主线。 试一试{ GoogleSignInAccount GoogleSignInAccount=task1.getResult(ApiException.class); }捕获(APIE){ 如果(例如getStatu

目前,我使用任务API进行了以下异步调用

异步的
Task Task=googleSignInClient.silentSignIn();
如果(!task.issusccessful()){
task.addOnCompleteListener(task1->{
//现在,这是主线。
试一试{
GoogleSignInAccount GoogleSignInAccount=task1.getResult(ApiException.class);
}捕获(APIE){
如果(例如getStatusCode()==谷歌登录状态码。需要登录){
}
}
});
}
我想将其重构为同步调用

同步的
Task Task=googleSignInClient.silentSignIn();
试一试{
//如何在Tasks.await中捕获ApiException
GoogleSignInAccount GoogleSignInAccount=Tasks.wait(任务);
}捕获(执行例外){
e、 printStackTrace();
}捕捉(中断异常e){
e、 printStackTrace();
}

然而,我想知道,我如何才能捕获所需的
ApiException
,就像我使用
task.getResult(ApiException.class)
所做的那样?

刚刚解决了这个问题:查看
Tasks.wait()的源代码,它包装了
ApiException
(或者任务抛出的任何
异常
)在
执行异常中

private static <TResult> TResult zzb(Task<TResult> task) throws ExecutionException {
    if (task.isSuccessful()) {
        return task.getResult();
    } else if (task.isCanceled()) {
        throw new CancellationException("Task is already canceled");
    } else {
        throw new ExecutionException(task.getException());
    }
}
} catch (ExecutionException e) {
    Throwable cause = e.getCause();
    if (cause instanceof ApiException) {
            String statusCodeString = GoogleSignInStatusCodes
                    .getStatusCodeString(((ApiException) cause).getStatusCode());
    }
}
使用
播放服务任务测试
版本
16.0.1

private static <TResult> TResult zzb(Task<TResult> task) throws ExecutionException {
    if (task.isSuccessful()) {
        return task.getResult();
    } else if (task.isCanceled()) {
        throw new CancellationException("Task is already canceled");
    } else {
        throw new ExecutionException(task.getException());
    }
}
} catch (ExecutionException e) {
    Throwable cause = e.getCause();
    if (cause instanceof ApiException) {
            String statusCodeString = GoogleSignInStatusCodes
                    .getStatusCodeString(((ApiException) cause).getStatusCode());
    }
}