diff --git a/libraries/session/src/main/java/androidx/media3/session/MediaController.java b/libraries/session/src/main/java/androidx/media3/session/MediaController.java index 68717bef39..b873991672 100644 --- a/libraries/session/src/main/java/androidx/media3/session/MediaController.java +++ b/libraries/session/src/main/java/androidx/media3/session/MediaController.java @@ -505,16 +505,19 @@ public class MediaController implements Player { /** * Releases the future controller returned by {@link Builder#buildAsync()}. It makes sure that the * controller is released by canceling the future if the future is not yet done. + * + *

Must be called on the {@linkplain #getApplicationLooper() application thread} of the media + * controller. */ public static void releaseFuture(Future controllerFuture) { - if (!controllerFuture.isDone()) { - controllerFuture.cancel(/* mayInterruptIfRunning= */ true); + if (controllerFuture.cancel(/* mayInterruptIfRunning= */ true)) { + // Successfully canceled the Future. The controller will be released by MediaControllerHolder. return; } MediaController controller; try { - controller = controllerFuture.get(); - } catch (CancellationException | ExecutionException | InterruptedException e) { + controller = Futures.getDone(controllerFuture); + } catch (CancellationException | ExecutionException e) { return; } controller.release();