diff --git a/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayerImplInternal.java b/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayerImplInternal.java index e05068a7b3..e004eec4d7 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayerImplInternal.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayerImplInternal.java @@ -339,7 +339,7 @@ import java.util.Collections; } maybeNotifyPlaybackInfoChanged(); } catch (ExoPlaybackException e) { - Log.e(TAG, "Renderer error.", e); + Log.e(TAG, "Playback error.", e); stopInternal(/* reset= */ false, /* acknowledgeStop= */ false); eventHandler.obtainMessage(MSG_ERROR, e).sendToTarget(); maybeNotifyPlaybackInfoChanged(); @@ -805,7 +805,7 @@ import java.util.Collections; } } - private void sendMessageInternal(PlayerMessage message) { + private void sendMessageInternal(PlayerMessage message) throws ExoPlaybackException { if (message.getPositionMs() == C.TIME_UNSET) { // If no delivery time is specified, trigger immediate message delivery. sendMessageToTarget(message); @@ -824,7 +824,7 @@ import java.util.Collections; } } - private void sendMessageToTarget(PlayerMessage message) { + private void sendMessageToTarget(PlayerMessage message) throws ExoPlaybackException { if (message.getHandler().getLooper() == handler.getLooper()) { deliverMessage(message); if (playbackInfo.playbackState == Player.STATE_READY @@ -838,22 +838,24 @@ import java.util.Collections; } private void sendMessageToTargetThread(final PlayerMessage message) { - message - .getHandler() - .post( - new Runnable() { - @Override - public void run() { - deliverMessage(message); - } - }); + Handler handler = message.getHandler(); + handler.post( + new Runnable() { + @Override + public void run() { + try { + deliverMessage(message); + } catch (ExoPlaybackException e) { + Log.e(TAG, "Unexpected error delivering message on external thread.", e); + throw new RuntimeException(e); + } + } + }); } - private void deliverMessage(PlayerMessage message) { + private void deliverMessage(PlayerMessage message) throws ExoPlaybackException { try { message.getTarget().handleMessage(message.getType(), message.getPayload()); - } catch (ExoPlaybackException e) { - eventHandler.obtainMessage(MSG_ERROR, e).sendToTarget(); } finally { message.markAsProcessed(/* isDelivered= */ true); } @@ -899,7 +901,8 @@ import java.util.Collections; return true; } - private void maybeTriggerPendingMessages(long oldPeriodPositionUs, long newPeriodPositionUs) { + private void maybeTriggerPendingMessages(long oldPeriodPositionUs, long newPeriodPositionUs) + throws ExoPlaybackException { if (pendingMessages.isEmpty() || playbackInfo.periodId.isAd()) { return; } diff --git a/library/core/src/main/java/com/google/android/exoplayer2/PlayerMessage.java b/library/core/src/main/java/com/google/android/exoplayer2/PlayerMessage.java index 1e8a89e102..408cbecaf1 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/PlayerMessage.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/PlayerMessage.java @@ -33,7 +33,8 @@ public final class PlayerMessage { * * @param messageType The message type. * @param payload The message payload. - * @throws ExoPlaybackException If an error occurred whilst handling the message. + * @throws ExoPlaybackException If an error occurred whilst handling the message. Should only be + * thrown by targets that handle messages on the playback thread. */ void handleMessage(int messageType, Object payload) throws ExoPlaybackException; }