Задача API - Как реорганизовать асинхронный вызов в синхронный вызов, но в то же время может захватить желаемое исключение (ApiException) - PullRequest
0 голосов
/ 23 мая 2018

В настоящее время у меня есть следующий асинхронный вызов с использованием 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)?

1 Ответ

0 голосов
/ 09 января 2019

Только что обошёл это: глядя на источник 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

...