From e43658af1fe5f995a278e643161ec45b94469d49 Mon Sep 17 00:00:00 2001 From: ibaker Date: Mon, 21 Oct 2019 11:58:59 +0100 Subject: [PATCH] Switch back from method ref to Runnable in HlsSampleStreamWrapper This reverts https://github.com/google/ExoPlayer/commit/a81dea6a47c7df83f029e03080dd6878ab75f133 and adds in the necessary nullness annotations After a discussion that this:: method references allocate on every call: https://dzone.com/articles/passing-thismethod-reference-within-a-loop-affects PiperOrigin-RevId: 275813989 --- .../source/hls/HlsSampleStreamWrapper.java | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/HlsSampleStreamWrapper.java b/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/HlsSampleStreamWrapper.java index 70a85730e7..00e25f0913 100644 --- a/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/HlsSampleStreamWrapper.java +++ b/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/HlsSampleStreamWrapper.java @@ -121,6 +121,9 @@ import org.checkerframework.checker.nullness.qual.RequiresNonNull; private final HlsChunkSource.HlsChunkHolder nextChunkHolder; private final ArrayList mediaChunks; private final List readOnlyMediaChunks; + // Using runnables rather than in-line method references to avoid repeated allocations. + private final Runnable maybeFinishPrepareRunnable; + private final Runnable onTracksEndedRunnable; private final Handler handler; private final ArrayList hlsSampleStreams; private final Map overridingDrmInitData; @@ -212,6 +215,13 @@ import org.checkerframework.checker.nullness.qual.RequiresNonNull; mediaChunks = new ArrayList<>(); readOnlyMediaChunks = Collections.unmodifiableList(mediaChunks); hlsSampleStreams = new ArrayList<>(); + // Suppressions are needed because `this` is not initialized here. + @SuppressWarnings("nullness:methodref.receiver.bound.invalid") + Runnable maybeFinishPrepareRunnable = this::maybeFinishPrepare; + this.maybeFinishPrepareRunnable = maybeFinishPrepareRunnable; + @SuppressWarnings("nullness:methodref.receiver.bound.invalid") + Runnable onTracksEndedRunnable = this::onTracksEnded; + this.onTracksEndedRunnable = onTracksEndedRunnable; handler = new Handler(); lastSeekPositionUs = positionUs; pendingResetPositionUs = positionUs; @@ -936,7 +946,7 @@ import org.checkerframework.checker.nullness.qual.RequiresNonNull; @Override public void endTracks() { tracksEnded = true; - handler.post(this::onTracksEnded); + handler.post(onTracksEndedRunnable); } @Override @@ -948,7 +958,7 @@ import org.checkerframework.checker.nullness.qual.RequiresNonNull; @Override public void onUpstreamFormatChanged(Format format) { - handler.post(this::maybeFinishPrepare); + handler.post(maybeFinishPrepareRunnable); } // Called by the loading thread.