mirror of
https://github.com/AntennaPod/AntennaPod.git
synced 2025-10-29 11:49:33 +00:00
Fix crash in PlaybackService (#7751)
When service is quickly stopped again due to a playback error, background tasks might not have delivered their result yet. In this case, the service objects already get cleaned up. Now, if the result gets delivered, the service is in an invalid state.
This commit is contained in:
parent
5459368e51
commit
7c7863f2ea
@ -64,6 +64,7 @@ import de.danoeh.antennapod.playback.service.internal.PlaybackVolumeUpdater;
|
||||
import de.danoeh.antennapod.playback.service.internal.WearMediaSession;
|
||||
import de.danoeh.antennapod.ui.notifications.NotificationUtils;
|
||||
import de.danoeh.antennapod.ui.widget.WidgetUpdater;
|
||||
import io.reactivex.disposables.CompositeDisposable;
|
||||
import org.greenrobot.eventbus.EventBus;
|
||||
import org.greenrobot.eventbus.Subscribe;
|
||||
import org.greenrobot.eventbus.ThreadMode;
|
||||
@ -162,6 +163,7 @@ public class PlaybackService extends MediaBrowserServiceCompat {
|
||||
private Disposable positionEventTimer;
|
||||
private PlaybackServiceNotificationBuilder notificationBuilder;
|
||||
private CastStateListener castStateListener;
|
||||
private final CompositeDisposable singleShotDisposables = new CompositeDisposable();
|
||||
|
||||
private String autoSkippedFeedMediaId = null;
|
||||
private String positionJustResetAfterPlayback = null;
|
||||
@ -313,6 +315,7 @@ public class PlaybackService extends MediaBrowserServiceCompat {
|
||||
notificationManager.notify(R.id.notification_playing, notificationBuilder.build());
|
||||
}
|
||||
}
|
||||
singleShotDisposables.clear();
|
||||
stateManager.stopForeground(!UserPreferences.isPersistNotify());
|
||||
isRunning = false;
|
||||
currentMediaType = MediaType.UNKNOWN;
|
||||
@ -349,7 +352,7 @@ public class PlaybackService extends MediaBrowserServiceCompat {
|
||||
}
|
||||
|
||||
private void loadQueueForMediaSession() {
|
||||
Single.<List<MediaSessionCompat.QueueItem>>create(emitter -> {
|
||||
Disposable d = Single.<List<MediaSessionCompat.QueueItem>>create(emitter -> {
|
||||
List<MediaSessionCompat.QueueItem> queueItems = new ArrayList<>();
|
||||
for (FeedItem feedItem : DBReader.getQueue()) {
|
||||
if (feedItem.getMedia() != null) {
|
||||
@ -362,6 +365,7 @@ public class PlaybackService extends MediaBrowserServiceCompat {
|
||||
.subscribeOn(Schedulers.io())
|
||||
.observeOn(AndroidSchedulers.mainThread())
|
||||
.subscribe(queueItems -> mediaSession.setQueue(queueItems), Throwable::printStackTrace);
|
||||
singleShotDisposables.add(d);
|
||||
}
|
||||
|
||||
private MediaBrowserCompat.MediaItem createBrowsableMediaItem(
|
||||
@ -405,7 +409,7 @@ public class PlaybackService extends MediaBrowserServiceCompat {
|
||||
Log.d(TAG, "OnLoadChildren: parentMediaId=" + parentId);
|
||||
result.detach();
|
||||
|
||||
Completable.create(emitter -> {
|
||||
Disposable d = Completable.create(emitter -> {
|
||||
result.sendResult(loadChildrenSynchronous(parentId));
|
||||
emitter.onComplete();
|
||||
})
|
||||
@ -417,6 +421,7 @@ public class PlaybackService extends MediaBrowserServiceCompat {
|
||||
e.printStackTrace();
|
||||
result.sendResult(null);
|
||||
});
|
||||
singleShotDisposables.add(d);
|
||||
}
|
||||
|
||||
private List<MediaBrowserCompat.MediaItem> loadChildrenSynchronous(@NonNull String parentId) {
|
||||
@ -536,7 +541,7 @@ public class PlaybackService extends MediaBrowserServiceCompat {
|
||||
if (allowStreamAlways) {
|
||||
UserPreferences.setAllowMobileStreaming(true);
|
||||
}
|
||||
Observable.fromCallable(
|
||||
Disposable d = Observable.fromCallable(
|
||||
() -> {
|
||||
if (playable instanceof FeedMedia) {
|
||||
return DBReader.getFeedMedia(((FeedMedia) playable).getId());
|
||||
@ -553,6 +558,7 @@ public class PlaybackService extends MediaBrowserServiceCompat {
|
||||
error.printStackTrace();
|
||||
stateManager.stopService();
|
||||
});
|
||||
singleShotDisposables.add(d);
|
||||
} else {
|
||||
mediaSession.getController().getTransportControls().sendCustomAction(customAction, null);
|
||||
}
|
||||
@ -741,7 +747,7 @@ public class PlaybackService extends MediaBrowserServiceCompat {
|
||||
}
|
||||
|
||||
private void startPlayingFromPreferences() {
|
||||
Observable.fromCallable(() -> DBReader.getFeedMedia(PlaybackPreferences.getCurrentlyPlayingFeedMediaId()))
|
||||
Disposable d = Observable.fromCallable(() -> DBReader.getFeedMedia(PlaybackPreferences.getCurrentlyPlayingFeedMediaId()))
|
||||
.subscribeOn(Schedulers.io())
|
||||
.observeOn(AndroidSchedulers.mainThread())
|
||||
.subscribe(
|
||||
@ -751,6 +757,7 @@ public class PlaybackService extends MediaBrowserServiceCompat {
|
||||
error.printStackTrace();
|
||||
stateManager.stopService();
|
||||
});
|
||||
singleShotDisposables.add(d);
|
||||
}
|
||||
|
||||
private void startPlaying(Playable playable, boolean allowStreamThisTime) {
|
||||
|
||||
@ -133,7 +133,13 @@ public class ExoPlayerWrapper {
|
||||
if (cause != null && "Source error".equals(cause.getMessage())) {
|
||||
cause = cause.getCause();
|
||||
}
|
||||
audioErrorListener.accept(cause != null ? cause.getMessage() : error.getMessage());
|
||||
if (cause != null && cause.getMessage() != null) {
|
||||
audioErrorListener.accept(cause.getMessage());
|
||||
} else if (error.getMessage() != null && cause != null) {
|
||||
audioErrorListener.accept(error.getMessage() + ": " + cause.getClass().getSimpleName());
|
||||
} else {
|
||||
audioErrorListener.accept(null);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user