diff --git a/RELEASENOTES.md b/RELEASENOTES.md index 927a1be2ad..213b5b1bcf 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -60,6 +60,8 @@ Release notes * Cast extension * Bump Cast SDK version to 21.2.0. * IMA extension + * Remove player listener of the `ImaServerSideAdInsertionMediaSource` on + the application thread to avoid threading issues. * Bump IMA SDK version to 3.29.0. ### 1.0.0-beta03 (2022-11-22) diff --git a/libraries/exoplayer_ima/src/main/java/androidx/media3/exoplayer/ima/ImaServerSideAdInsertionMediaSource.java b/libraries/exoplayer_ima/src/main/java/androidx/media3/exoplayer/ima/ImaServerSideAdInsertionMediaSource.java index 150c852a91..2f328e1c15 100644 --- a/libraries/exoplayer_ima/src/main/java/androidx/media3/exoplayer/ima/ImaServerSideAdInsertionMediaSource.java +++ b/libraries/exoplayer_ima/src/main/java/androidx/media3/exoplayer/ima/ImaServerSideAdInsertionMediaSource.java @@ -36,6 +36,7 @@ import android.content.Context; import android.net.Uri; import android.os.Bundle; import android.os.Handler; +import android.os.Looper; import android.util.Pair; import android.view.ViewGroup; import androidx.annotation.IntDef; @@ -495,7 +496,8 @@ public final class ImaServerSideAdInsertionMediaSource extends CompositeMediaSou this.applicationAdEventListener = applicationAdEventListener; this.applicationAdErrorListener = applicationAdErrorListener; componentListener = new ComponentListener(); - mainHandler = Util.createHandlerForCurrentLooper(); + Assertions.checkArgument(player.getApplicationLooper() == Looper.getMainLooper()); + mainHandler = new Handler(Looper.getMainLooper()); Uri streamRequestUri = checkNotNull(mediaItem.localConfiguration).uri; isLiveStream = ImaServerSideAdInsertionUriBuilder.isLiveStream(streamRequestUri); adsId = ImaServerSideAdInsertionUriBuilder.getAdsId(streamRequestUri); @@ -572,8 +574,11 @@ public final class ImaServerSideAdInsertionMediaSource extends CompositeMediaSou super.releaseSourceInternal(); if (loader != null) { loader.release(); - player.removeListener(componentListener); - mainHandler.post(() -> setStreamManager(/* streamManager= */ null)); + mainHandler.post( + () -> { + player.removeListener(componentListener); + setStreamManager(/* streamManager= */ null); + }); loader = null; } }