Add Util.postOrRun
To avoid repetition, it adds Util.postOrRun and replaces existing instances with the util method. PiperOrigin-RevId: 329472769
This commit is contained in:
parent
91185500a1
commit
d155416c54
@ -15,8 +15,10 @@
|
|||||||
*/
|
*/
|
||||||
package com.google.android.exoplayer2.ext.media2;
|
package com.google.android.exoplayer2.ext.media2;
|
||||||
|
|
||||||
|
import static com.google.android.exoplayer2.util.Util.postOrRun;
|
||||||
import static java.util.concurrent.TimeUnit.MILLISECONDS;
|
import static java.util.concurrent.TimeUnit.MILLISECONDS;
|
||||||
|
|
||||||
|
import android.os.Handler;
|
||||||
import androidx.annotation.GuardedBy;
|
import androidx.annotation.GuardedBy;
|
||||||
import androidx.annotation.IntDef;
|
import androidx.annotation.IntDef;
|
||||||
import androidx.annotation.Nullable;
|
import androidx.annotation.Nullable;
|
||||||
@ -129,7 +131,7 @@ import java.util.concurrent.Callable;
|
|||||||
|
|
||||||
// Should be only used on the handler.
|
// Should be only used on the handler.
|
||||||
private final PlayerWrapper player;
|
private final PlayerWrapper player;
|
||||||
private final PlayerHandler handler;
|
private final Handler handler;
|
||||||
private final Object lock;
|
private final Object lock;
|
||||||
|
|
||||||
@GuardedBy("lock")
|
@GuardedBy("lock")
|
||||||
@ -141,7 +143,7 @@ import java.util.concurrent.Callable;
|
|||||||
// Should be only used on the handler.
|
// Should be only used on the handler.
|
||||||
@Nullable private AsyncPlayerCommandResult pendingAsyncPlayerCommandResult;
|
@Nullable private AsyncPlayerCommandResult pendingAsyncPlayerCommandResult;
|
||||||
|
|
||||||
public PlayerCommandQueue(PlayerWrapper player, PlayerHandler handler) {
|
public PlayerCommandQueue(PlayerWrapper player, Handler handler) {
|
||||||
this.player = player;
|
this.player = player;
|
||||||
this.handler = handler;
|
this.handler = handler;
|
||||||
lock = new Object();
|
lock = new Object();
|
||||||
@ -209,7 +211,7 @@ import java.util.concurrent.Callable;
|
|||||||
}
|
}
|
||||||
processPendingCommandOnHandler();
|
processPendingCommandOnHandler();
|
||||||
},
|
},
|
||||||
handler::postOrRun);
|
(runnable) -> postOrRun(handler, runnable));
|
||||||
if (DEBUG) {
|
if (DEBUG) {
|
||||||
Log.d(TAG, "adding " + playerCommand);
|
Log.d(TAG, "adding " + playerCommand);
|
||||||
}
|
}
|
||||||
@ -220,7 +222,8 @@ import java.util.concurrent.Callable;
|
|||||||
}
|
}
|
||||||
|
|
||||||
public void notifyCommandError() {
|
public void notifyCommandError() {
|
||||||
handler.postOrRun(
|
postOrRun(
|
||||||
|
handler,
|
||||||
() -> {
|
() -> {
|
||||||
@Nullable AsyncPlayerCommandResult pendingResult = pendingAsyncPlayerCommandResult;
|
@Nullable AsyncPlayerCommandResult pendingResult = pendingAsyncPlayerCommandResult;
|
||||||
if (pendingResult == null) {
|
if (pendingResult == null) {
|
||||||
@ -243,7 +246,8 @@ import java.util.concurrent.Callable;
|
|||||||
if (DEBUG) {
|
if (DEBUG) {
|
||||||
Log.d(TAG, "notifyCommandCompleted, completedCommandCode=" + completedCommandCode);
|
Log.d(TAG, "notifyCommandCompleted, completedCommandCode=" + completedCommandCode);
|
||||||
}
|
}
|
||||||
handler.postOrRun(
|
postOrRun(
|
||||||
|
handler,
|
||||||
() -> {
|
() -> {
|
||||||
@Nullable AsyncPlayerCommandResult pendingResult = pendingAsyncPlayerCommandResult;
|
@Nullable AsyncPlayerCommandResult pendingResult = pendingAsyncPlayerCommandResult;
|
||||||
if (pendingResult == null || pendingResult.commandCode != completedCommandCode) {
|
if (pendingResult == null || pendingResult.commandCode != completedCommandCode) {
|
||||||
@ -267,7 +271,7 @@ import java.util.concurrent.Callable;
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void processPendingCommand() {
|
private void processPendingCommand() {
|
||||||
handler.postOrRun(this::processPendingCommandOnHandler);
|
postOrRun(handler, this::processPendingCommandOnHandler);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void processPendingCommandOnHandler() {
|
private void processPendingCommandOnHandler() {
|
||||||
|
@ -1,41 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright 2019 The Android Open Source Project
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
package com.google.android.exoplayer2.ext.media2;
|
|
||||||
|
|
||||||
import android.os.Handler;
|
|
||||||
import android.os.Looper;
|
|
||||||
|
|
||||||
/** A {@link Handler} that provides {@link #postOrRun(Runnable)}. */
|
|
||||||
/* package */ final class PlayerHandler extends Handler {
|
|
||||||
public PlayerHandler(Looper looper) {
|
|
||||||
super(looper);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Posts the {@link Runnable} if the calling thread differs with the {@link Looper} of this
|
|
||||||
* handler. Otherwise, runs the runnable directly.
|
|
||||||
*
|
|
||||||
* @param r A runnable to either post or run.
|
|
||||||
* @return {@code true} if it's successfully run. {@code false} otherwise.
|
|
||||||
*/
|
|
||||||
public boolean postOrRun(Runnable r) {
|
|
||||||
if (Thread.currentThread() != getLooper().getThread()) {
|
|
||||||
return post(r);
|
|
||||||
}
|
|
||||||
r.run();
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
@ -15,6 +15,9 @@
|
|||||||
*/
|
*/
|
||||||
package com.google.android.exoplayer2.ext.media2;
|
package com.google.android.exoplayer2.ext.media2;
|
||||||
|
|
||||||
|
import static com.google.android.exoplayer2.util.Util.postOrRun;
|
||||||
|
|
||||||
|
import android.os.Handler;
|
||||||
import androidx.annotation.IntRange;
|
import androidx.annotation.IntRange;
|
||||||
import androidx.annotation.Nullable;
|
import androidx.annotation.Nullable;
|
||||||
import androidx.core.util.ObjectsCompat;
|
import androidx.core.util.ObjectsCompat;
|
||||||
@ -100,7 +103,7 @@ import java.util.List;
|
|||||||
private static final int POLL_BUFFER_INTERVAL_MS = 1000;
|
private static final int POLL_BUFFER_INTERVAL_MS = 1000;
|
||||||
|
|
||||||
private final Listener listener;
|
private final Listener listener;
|
||||||
private final PlayerHandler handler;
|
private final Handler handler;
|
||||||
private final Runnable pollBufferRunnable;
|
private final Runnable pollBufferRunnable;
|
||||||
|
|
||||||
private final Player player;
|
private final Player player;
|
||||||
@ -144,7 +147,7 @@ import java.util.List;
|
|||||||
audioComponent.addAudioListener(componentListener);
|
audioComponent.addAudioListener(componentListener);
|
||||||
}
|
}
|
||||||
|
|
||||||
handler = new PlayerHandler(player.getApplicationLooper());
|
handler = new Handler(player.getApplicationLooper());
|
||||||
pollBufferRunnable = new PollBufferRunnable();
|
pollBufferRunnable = new PollBufferRunnable();
|
||||||
|
|
||||||
media2Playlist = new ArrayList<>();
|
media2Playlist = new ArrayList<>();
|
||||||
@ -436,7 +439,7 @@ import java.util.List;
|
|||||||
|
|
||||||
private void handlePlayerStateChanged(@Player.State int state) {
|
private void handlePlayerStateChanged(@Player.State int state) {
|
||||||
if (state == Player.STATE_READY || state == Player.STATE_BUFFERING) {
|
if (state == Player.STATE_READY || state == Player.STATE_BUFFERING) {
|
||||||
handler.postOrRun(pollBufferRunnable);
|
postOrRun(handler, pollBufferRunnable);
|
||||||
} else {
|
} else {
|
||||||
handler.removeCallbacks(pollBufferRunnable);
|
handler.removeCallbacks(pollBufferRunnable);
|
||||||
}
|
}
|
||||||
|
@ -15,6 +15,9 @@
|
|||||||
*/
|
*/
|
||||||
package com.google.android.exoplayer2.ext.media2;
|
package com.google.android.exoplayer2.ext.media2;
|
||||||
|
|
||||||
|
import static com.google.android.exoplayer2.util.Util.postOrRun;
|
||||||
|
|
||||||
|
import android.os.Handler;
|
||||||
import androidx.annotation.FloatRange;
|
import androidx.annotation.FloatRange;
|
||||||
import androidx.annotation.GuardedBy;
|
import androidx.annotation.GuardedBy;
|
||||||
import androidx.annotation.IntRange;
|
import androidx.annotation.IntRange;
|
||||||
@ -64,7 +67,7 @@ public final class SessionPlayerConnector extends SessionPlayer {
|
|||||||
private static final int END_OF_PLAYLIST = -1;
|
private static final int END_OF_PLAYLIST = -1;
|
||||||
private final Object stateLock = new Object();
|
private final Object stateLock = new Object();
|
||||||
|
|
||||||
private final PlayerHandler taskHandler;
|
private final Handler taskHandler;
|
||||||
private final Executor taskHandlerExecutor;
|
private final Executor taskHandlerExecutor;
|
||||||
private final PlayerWrapper player;
|
private final PlayerWrapper player;
|
||||||
private final PlayerCommandQueue playerCommandQueue;
|
private final PlayerCommandQueue playerCommandQueue;
|
||||||
@ -106,8 +109,8 @@ public final class SessionPlayerConnector extends SessionPlayer {
|
|||||||
Assertions.checkNotNull(controlDispatcher);
|
Assertions.checkNotNull(controlDispatcher);
|
||||||
|
|
||||||
state = PLAYER_STATE_IDLE;
|
state = PLAYER_STATE_IDLE;
|
||||||
taskHandler = new PlayerHandler(player.getApplicationLooper());
|
taskHandler = new Handler(player.getApplicationLooper());
|
||||||
taskHandlerExecutor = taskHandler::postOrRun;
|
taskHandlerExecutor = (runnable) -> postOrRun(taskHandler, runnable);
|
||||||
ExoPlayerWrapperListener playerListener = new ExoPlayerWrapperListener();
|
ExoPlayerWrapperListener playerListener = new ExoPlayerWrapperListener();
|
||||||
this.player = new PlayerWrapper(playerListener, player, mediaItemConverter, controlDispatcher);
|
this.player = new PlayerWrapper(playerListener, player, mediaItemConverter, controlDispatcher);
|
||||||
playerCommandQueue = new PlayerCommandQueue(this.player, taskHandler);
|
playerCommandQueue = new PlayerCommandQueue(this.player, taskHandler);
|
||||||
@ -598,7 +601,8 @@ public final class SessionPlayerConnector extends SessionPlayer {
|
|||||||
private <T> T runPlayerCallableBlocking(Callable<T> callable) {
|
private <T> T runPlayerCallableBlocking(Callable<T> callable) {
|
||||||
SettableFuture<T> future = SettableFuture.create();
|
SettableFuture<T> future = SettableFuture.create();
|
||||||
boolean success =
|
boolean success =
|
||||||
taskHandler.postOrRun(
|
postOrRun(
|
||||||
|
taskHandler,
|
||||||
() -> {
|
() -> {
|
||||||
try {
|
try {
|
||||||
future.set(callable.call());
|
future.set(callable.call());
|
||||||
|
@ -493,6 +493,24 @@ public final class Util {
|
|||||||
return new Handler(looper, callback);
|
return new Handler(looper, callback);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Posts the {@link Runnable} if the calling thread differs with the {@link Looper} of the {@link
|
||||||
|
* Handler}. Otherwise, runs the {@link Runnable} directly.
|
||||||
|
*
|
||||||
|
* @param handler The handler to which the {@link Runnable} will be posted.
|
||||||
|
* @param runnable The runnable to either post or run.
|
||||||
|
* @return {@code true} if the {@link Runnable} was successfully posted to the {@link Handler} or
|
||||||
|
* run. {@code false} otherwise.
|
||||||
|
*/
|
||||||
|
public static boolean postOrRun(Handler handler, Runnable runnable) {
|
||||||
|
if (handler.getLooper() == Looper.myLooper()) {
|
||||||
|
runnable.run();
|
||||||
|
return true;
|
||||||
|
} else {
|
||||||
|
return handler.post(runnable);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the {@link Looper} associated with the current thread, or the {@link Looper} of the
|
* Returns the {@link Looper} associated with the current thread, or the {@link Looper} of the
|
||||||
* application's main thread if the current thread doesn't have a {@link Looper}.
|
* application's main thread if the current thread doesn't have a {@link Looper}.
|
||||||
|
@ -15,8 +15,9 @@
|
|||||||
*/
|
*/
|
||||||
package com.google.android.exoplayer2.drm;
|
package com.google.android.exoplayer2.drm;
|
||||||
|
|
||||||
|
import static com.google.android.exoplayer2.util.Util.postOrRun;
|
||||||
|
|
||||||
import android.os.Handler;
|
import android.os.Handler;
|
||||||
import android.os.Looper;
|
|
||||||
import androidx.annotation.CheckResult;
|
import androidx.annotation.CheckResult;
|
||||||
import androidx.annotation.Nullable;
|
import androidx.annotation.Nullable;
|
||||||
import com.google.android.exoplayer2.Player;
|
import com.google.android.exoplayer2.Player;
|
||||||
@ -207,15 +208,6 @@ public interface DrmSessionEventListener {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Dispatches {@link #onDrmSessionAcquired(int, MediaPeriodId)}. */
|
|
||||||
private static void postOrRun(Handler handler, Runnable runnable) {
|
|
||||||
if (handler.getLooper() == Looper.myLooper()) {
|
|
||||||
runnable.run();
|
|
||||||
} else {
|
|
||||||
handler.post(runnable);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private static final class ListenerAndHandler {
|
private static final class ListenerAndHandler {
|
||||||
|
|
||||||
public Handler handler;
|
public Handler handler;
|
||||||
|
@ -15,8 +15,9 @@
|
|||||||
*/
|
*/
|
||||||
package com.google.android.exoplayer2.source;
|
package com.google.android.exoplayer2.source;
|
||||||
|
|
||||||
|
import static com.google.android.exoplayer2.util.Util.postOrRun;
|
||||||
|
|
||||||
import android.os.Handler;
|
import android.os.Handler;
|
||||||
import android.os.Looper;
|
|
||||||
import androidx.annotation.CheckResult;
|
import androidx.annotation.CheckResult;
|
||||||
import androidx.annotation.Nullable;
|
import androidx.annotation.Nullable;
|
||||||
import com.google.android.exoplayer2.C;
|
import com.google.android.exoplayer2.C;
|
||||||
@ -471,14 +472,6 @@ public interface MediaSourceEventListener {
|
|||||||
return mediaTimeMs == C.TIME_UNSET ? C.TIME_UNSET : mediaTimeOffsetMs + mediaTimeMs;
|
return mediaTimeMs == C.TIME_UNSET ? C.TIME_UNSET : mediaTimeOffsetMs + mediaTimeMs;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void postOrRun(Handler handler, Runnable runnable) {
|
|
||||||
if (handler.getLooper() == Looper.myLooper()) {
|
|
||||||
runnable.run();
|
|
||||||
} else {
|
|
||||||
handler.post(runnable);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private static final class ListenerAndHandler {
|
private static final class ListenerAndHandler {
|
||||||
|
|
||||||
public Handler handler;
|
public Handler handler;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user