gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 23:54:42 26 4
gpt4 key购买 nike

目前,我有以下使用任务 API 的异步调用。

异步

Task<GoogleSignInAccount> task = googleSignInClient.silentSignIn();
if (!task.isSuccessful()) {
task.addOnCompleteListener(task1 -> {
// Now, this is main thread.
try {
GoogleSignInAccount googleSignInAccount = task1.getResult(ApiException.class);
} catch (ApiException e) {
if (e.getStatusCode() == GoogleSignInStatusCodes.SIGN_IN_REQUIRED) {
}
}
});
}

我想将其重构为同步调用。

同步

Task<GoogleSignInAccount> task = googleSignInClient.silentSignIn();

try {
// How to capture ApiException in Tasks.await
GoogleSignInAccount googleSignInAccount = Tasks.await(task);
} catch (ExecutionException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}

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

最佳答案

刚刚解决这个问题:查看 Tasks.await() 的源代码,它包装了 ApiException(或任务抛出的任何 Exception ) 在 ExecutionException 中:

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

所以找出原因并检查它是否是一个ApiException:

} catch (ExecutionException e) {
Throwable cause = e.getCause();
if (cause instanceof ApiException) {
String statusCodeString = GoogleSignInStatusCodes
.getStatusCodeString(((ApiException) cause).getStatusCode());
}
}

使用 play-services-tasks 版本 16.0.1 进行测试。

https://developers.google.com/android/reference/com/google/android/gms/tasks/Tasks

关于android - 任务 API - 如何将异步调用重构为同步调用但能够捕获所需的异常 (ApiException),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50484855/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com