summaryrefslogtreecommitdiff
path: root/core/src
diff options
context:
space:
mode:
authorByteHamster <info@bytehamster.com>2020-10-24 23:24:41 +0200
committerByteHamster <info@bytehamster.com>2020-10-24 23:24:43 +0200
commit3f80a5fdb8c46e21184917bc947e022f6dee73b4 (patch)
treefc08f78d6fb4a784c7f71a79877456ecdff946a9 /core/src
parent69a3c56d247e0f32c156c49a396c989d746ba96e (diff)
downloadAntennaPod-3f80a5fdb8c46e21184917bc947e022f6dee73b4.zip
Ensure that first DB query is executed in background thread
This prevents crashes when the service is the first entry point after an update that needs a database upgrade.
Diffstat (limited to 'core/src')
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/service/playback/PlaybackService.java76
1 files changed, 46 insertions, 30 deletions
diff --git a/core/src/main/java/de/danoeh/antennapod/core/service/playback/PlaybackService.java b/core/src/main/java/de/danoeh/antennapod/core/service/playback/PlaybackService.java
index 8677ea030..49208206d 100644
--- a/core/src/main/java/de/danoeh/antennapod/core/service/playback/PlaybackService.java
+++ b/core/src/main/java/de/danoeh/antennapod/core/service/playback/PlaybackService.java
@@ -502,16 +502,27 @@ public class PlaybackService extends MediaBrowserServiceCompat {
stateManager.stopService();
return Service.START_NOT_STICKY;
}
- if (playable instanceof FeedMedia) {
- playable = DBReader.getFeedMedia(((FeedMedia) playable).getId());
- }
- if (playable == null) {
- Log.d(TAG, "Playable was not found. Stopping service.");
- stateManager.stopService();
- return Service.START_NOT_STICKY;
- }
- mediaPlayer.playMediaObject(playable, stream, startWhenPrepared, prepareImmediately);
- addPlayableToQueue(playable);
+
+ Observable.fromCallable(
+ () -> {
+ if (playable instanceof FeedMedia) {
+ return DBReader.getFeedMedia(((FeedMedia) playable).getId());
+ } else {
+ return playable;
+ }
+ })
+ .subscribeOn(Schedulers.io())
+ .observeOn(AndroidSchedulers.mainThread())
+ .subscribe(
+ playableLoaded -> {
+ mediaPlayer.playMediaObject(playable, stream, startWhenPrepared,
+ prepareImmediately);
+ addPlayableToQueue(playable);
+ }, error -> {
+ Log.d(TAG, "Playable was not found. Stopping service.");
+ stateManager.stopService();
+ });
+ return Service.START_NOT_STICKY;
} else {
Log.d(TAG, "Did not handle intent to PlaybackService: " + intent);
Log.d(TAG, "Extras: " + intent.getExtras());
@@ -680,26 +691,31 @@ public class PlaybackService extends MediaBrowserServiceCompat {
}
private void startPlayingFromPreferences() {
- Playable playable = Playable.PlayableUtils.createInstanceFromPreferences(getApplicationContext());
- if (playable != null) {
- if (PlaybackPreferences.getCurrentEpisodeIsStream() && !NetworkUtils.isStreamingAllowed()) {
- displayStreamingNotAllowedNotification(
- new PlaybackServiceStarter(this, playable)
- .prepareImmediately(true)
- .startWhenPrepared(true)
- .shouldStream(true)
- .getIntent());
- PlaybackPreferences.writeNoMediaPlaying();
- stateManager.stopService();
- return;
- }
- mediaPlayer.playMediaObject(playable, PlaybackPreferences.getCurrentEpisodeIsStream(), true, true);
- stateManager.validStartCommandWasReceived();
- PlaybackService.this.updateMediaSessionMetadata(playable);
- addPlayableToQueue(playable);
- } else {
- stateManager.stopService();
- }
+ Observable.fromCallable(() -> Playable.PlayableUtils.createInstanceFromPreferences(getApplicationContext()))
+ .subscribeOn(Schedulers.io())
+ .observeOn(AndroidSchedulers.mainThread())
+ .subscribe(
+ playable -> {
+ if (PlaybackPreferences.getCurrentEpisodeIsStream() && !NetworkUtils.isStreamingAllowed()) {
+ displayStreamingNotAllowedNotification(
+ new PlaybackServiceStarter(this, playable)
+ .prepareImmediately(true)
+ .startWhenPrepared(true)
+ .shouldStream(true)
+ .getIntent());
+ PlaybackPreferences.writeNoMediaPlaying();
+ stateManager.stopService();
+ return;
+ }
+ mediaPlayer.playMediaObject(playable, PlaybackPreferences.getCurrentEpisodeIsStream(),
+ true, true);
+ stateManager.validStartCommandWasReceived();
+ PlaybackService.this.updateMediaSessionMetadata(playable);
+ addPlayableToQueue(playable);
+ }, error -> {
+ Log.d(TAG, "Playable was not loaded from preferences. Stopping service.");
+ stateManager.stopService();
+ });
}
/**