Merge pull request #3167 from ByteHamster/threading
Fixed threading bugs in Sonic
This commit is contained in:
commit
86129a9686
@ -1088,25 +1088,17 @@ public class LocalPSMP extends PlaybackServiceMediaPlayer {
|
|||||||
mp -> genericSeekCompleteListener();
|
mp -> genericSeekCompleteListener();
|
||||||
|
|
||||||
private void genericSeekCompleteListener() {
|
private void genericSeekCompleteListener() {
|
||||||
Runnable r = () -> {
|
Log.d(TAG, "genericSeekCompleteListener");
|
||||||
Log.d(TAG, "genericSeekCompleteListener");
|
if (seekLatch != null) {
|
||||||
if(seekLatch != null) {
|
seekLatch.countDown();
|
||||||
seekLatch.countDown();
|
|
||||||
}
|
|
||||||
playerLock.lock();
|
|
||||||
if (playerStatus == PlayerStatus.PLAYING) {
|
|
||||||
callback.onPlaybackStart(media, getPosition());
|
|
||||||
}
|
|
||||||
if (playerStatus == PlayerStatus.SEEKING) {
|
|
||||||
setPlayerStatus(statusBeforeSeeking, media, getPosition());
|
|
||||||
}
|
|
||||||
playerLock.unlock();
|
|
||||||
};
|
|
||||||
|
|
||||||
if (useCallerThread) {
|
|
||||||
r.run();
|
|
||||||
} else {
|
|
||||||
new Thread(r).start();
|
|
||||||
}
|
}
|
||||||
|
playerLock.lock();
|
||||||
|
if (playerStatus == PlayerStatus.PLAYING) {
|
||||||
|
callback.onPlaybackStart(media, getPosition());
|
||||||
|
}
|
||||||
|
if (playerStatus == PlayerStatus.SEEKING) {
|
||||||
|
setPlayerStatus(statusBeforeSeeking, media, getPosition());
|
||||||
|
}
|
||||||
|
playerLock.unlock();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -16,6 +16,7 @@ import java.util.concurrent.TimeUnit;
|
|||||||
|
|
||||||
import de.danoeh.antennapod.core.event.QueueEvent;
|
import de.danoeh.antennapod.core.event.QueueEvent;
|
||||||
import de.danoeh.antennapod.core.feed.FeedItem;
|
import de.danoeh.antennapod.core.feed.FeedItem;
|
||||||
|
import de.danoeh.antennapod.core.preferences.UserPreferences;
|
||||||
import de.danoeh.antennapod.core.storage.DBReader;
|
import de.danoeh.antennapod.core.storage.DBReader;
|
||||||
import de.danoeh.antennapod.core.util.playback.Playable;
|
import de.danoeh.antennapod.core.util.playback.Playable;
|
||||||
import de.greenrobot.event.EventBus;
|
import de.greenrobot.event.EventBus;
|
||||||
@ -320,7 +321,7 @@ public class PlaybackServiceTaskManager {
|
|||||||
private final boolean shakeToReset;
|
private final boolean shakeToReset;
|
||||||
private final boolean vibrate;
|
private final boolean vibrate;
|
||||||
private ShakeListener shakeListener;
|
private ShakeListener shakeListener;
|
||||||
private Handler handler;
|
private final Handler handler;
|
||||||
|
|
||||||
public SleepTimer(long waitingTime, boolean shakeToReset, boolean vibrate) {
|
public SleepTimer(long waitingTime, boolean shakeToReset, boolean vibrate) {
|
||||||
super();
|
super();
|
||||||
@ -328,7 +329,21 @@ public class PlaybackServiceTaskManager {
|
|||||||
this.timeLeft = waitingTime;
|
this.timeLeft = waitingTime;
|
||||||
this.shakeToReset = shakeToReset;
|
this.shakeToReset = shakeToReset;
|
||||||
this.vibrate = vibrate;
|
this.vibrate = vibrate;
|
||||||
this.handler = new Handler(); // Use the same thread for callbacks (ExoPlayer)
|
|
||||||
|
if (UserPreferences.useExoplayer() && Looper.myLooper() == Looper.getMainLooper()) {
|
||||||
|
// Run callbacks in main thread so they can call ExoPlayer methods themselves
|
||||||
|
this.handler = new Handler();
|
||||||
|
} else {
|
||||||
|
this.handler = null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void postCallback(Runnable r) {
|
||||||
|
if (handler == null) {
|
||||||
|
r.run();
|
||||||
|
} else {
|
||||||
|
handler.post(r);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -354,7 +369,7 @@ public class PlaybackServiceTaskManager {
|
|||||||
if(shakeListener == null && shakeToReset) {
|
if(shakeListener == null && shakeToReset) {
|
||||||
shakeListener = new ShakeListener(context, this);
|
shakeListener = new ShakeListener(context, this);
|
||||||
}
|
}
|
||||||
handler.post(callback::onSleepTimerAlmostExpired);
|
postCallback(callback::onSleepTimerAlmostExpired);
|
||||||
notifiedAlmostExpired = true;
|
notifiedAlmostExpired = true;
|
||||||
}
|
}
|
||||||
if (timeLeft <= 0) {
|
if (timeLeft <= 0) {
|
||||||
@ -364,7 +379,7 @@ public class PlaybackServiceTaskManager {
|
|||||||
shakeListener = null;
|
shakeListener = null;
|
||||||
}
|
}
|
||||||
if (!Thread.currentThread().isInterrupted()) {
|
if (!Thread.currentThread().isInterrupted()) {
|
||||||
handler.post(callback::onSleepTimerExpired);
|
postCallback(callback::onSleepTimerExpired);
|
||||||
} else {
|
} else {
|
||||||
Log.d(TAG, "Sleep timer interrupted");
|
Log.d(TAG, "Sleep timer interrupted");
|
||||||
}
|
}
|
||||||
@ -382,7 +397,7 @@ public class PlaybackServiceTaskManager {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public void onShake() {
|
public void onShake() {
|
||||||
handler.post(() -> {
|
postCallback(() -> {
|
||||||
setSleepTimer(waitingTime, shakeToReset, vibrate);
|
setSleepTimer(waitingTime, shakeToReset, vibrate);
|
||||||
callback.onSleepTimerReset();
|
callback.onSleepTimerReset();
|
||||||
});
|
});
|
||||||
|
Loading…
x
Reference in New Issue
Block a user