move progress handler to separate thread
This commit is contained in:
parent
5c965cfbd1
commit
0e84e99a6c
1 changed files with 34 additions and 28 deletions
|
|
@ -80,9 +80,9 @@ public class MusicService extends Service implements SharedPreferences.OnSharedP
|
||||||
public static final String ACTION_REWIND = PACKAGE_NAME + ".rewind";
|
public static final String ACTION_REWIND = PACKAGE_NAME + ".rewind";
|
||||||
public static final String ACTION_QUIT = PACKAGE_NAME + ".quit";
|
public static final String ACTION_QUIT = PACKAGE_NAME + ".quit";
|
||||||
public static final String ACTION_PENDING_QUIT = PACKAGE_NAME + ".quit.pending";
|
public static final String ACTION_PENDING_QUIT = PACKAGE_NAME + ".quit.pending";
|
||||||
|
|
||||||
public static final String INTENT_EXTRA_PLAYLIST = PACKAGE_NAME + ".extra.playlist";
|
public static final String INTENT_EXTRA_PLAYLIST = PACKAGE_NAME + ".extra.playlist";
|
||||||
public static final String INTENT_EXTRA_SHUFFLE = PACKAGE_NAME + ".extra.shuffle";
|
public static final String INTENT_EXTRA_SHUFFLE = PACKAGE_NAME + ".extra.shuffle";
|
||||||
|
|
||||||
public static final String INTENT_EXTRA_WIDGET_UPDATE = PACKAGE_NAME + ".extra.widget.update";
|
public static final String INTENT_EXTRA_WIDGET_UPDATE = PACKAGE_NAME + ".extra.widget.update";
|
||||||
public static final String INTENT_EXTRA_WIDGET_NAME = PACKAGE_NAME + ".extra.widget.name";
|
public static final String INTENT_EXTRA_WIDGET_NAME = PACKAGE_NAME + ".extra.widget.name";
|
||||||
|
|
||||||
|
|
@ -144,11 +144,12 @@ public class MusicService extends Service implements SharedPreferences.OnSharedP
|
||||||
private PlaybackHandler playerHandler;
|
private PlaybackHandler playerHandler;
|
||||||
private Handler uiThreadHandler;
|
private Handler uiThreadHandler;
|
||||||
private ThrottledSeekHandler throttledSeekHandler;
|
private ThrottledSeekHandler throttledSeekHandler;
|
||||||
private QueueSaveHandler queueSaveHandler;
|
private QueueHandler queueHandler;
|
||||||
private ProgressHandler progressHandler;
|
private ProgressHandler progressHandler;
|
||||||
|
|
||||||
private HandlerThread playerHandlerThread;
|
private HandlerThread playerHandlerThread;
|
||||||
private HandlerThread queueSaveHandlerThread;
|
private HandlerThread progressHandlerThread;
|
||||||
|
private HandlerThread queueHandlerThread;
|
||||||
|
|
||||||
private final BroadcastReceiver becomingNoisyReceiver = new BroadcastReceiver() {
|
private final BroadcastReceiver becomingNoisyReceiver = new BroadcastReceiver() {
|
||||||
@Override
|
@Override
|
||||||
|
|
@ -209,13 +210,16 @@ public class MusicService extends Service implements SharedPreferences.OnSharedP
|
||||||
playerHandlerThread.start();
|
playerHandlerThread.start();
|
||||||
playerHandler = new PlaybackHandler(this, playerHandlerThread.getLooper());
|
playerHandler = new PlaybackHandler(this, playerHandlerThread.getLooper());
|
||||||
|
|
||||||
queueSaveHandlerThread = new HandlerThread(QueueSaveHandler.class.getName(), Process.THREAD_PRIORITY_BACKGROUND);
|
progressHandlerThread = new HandlerThread(ProgressHandler.class.getName());
|
||||||
queueSaveHandlerThread.start();
|
progressHandlerThread.start();
|
||||||
queueSaveHandler = new QueueSaveHandler(this, queueSaveHandlerThread.getLooper());
|
progressHandler = new ProgressHandler(this, progressHandlerThread.getLooper());
|
||||||
|
|
||||||
|
queueHandlerThread = new HandlerThread(QueueHandler.class.getName(), Process.THREAD_PRIORITY_BACKGROUND);
|
||||||
|
queueHandlerThread.start();
|
||||||
|
queueHandler = new QueueHandler(this, queueHandlerThread.getLooper());
|
||||||
|
|
||||||
uiThreadHandler = new Handler();
|
|
||||||
progressHandler = new ProgressHandler(this, Looper.myLooper());
|
|
||||||
throttledSeekHandler = new ThrottledSeekHandler(playerHandler);
|
throttledSeekHandler = new ThrottledSeekHandler(playerHandler);
|
||||||
|
uiThreadHandler = new Handler();
|
||||||
|
|
||||||
registerReceiver(widgetIntentReceiver, new IntentFilter(INTENT_EXTRA_WIDGET_UPDATE));
|
registerReceiver(widgetIntentReceiver, new IntentFilter(INTENT_EXTRA_WIDGET_UPDATE));
|
||||||
registerReceiver(becomingNoisyReceiver, new IntentFilter(AudioManager.ACTION_AUDIO_BECOMING_NOISY));
|
registerReceiver(becomingNoisyReceiver, new IntentFilter(AudioManager.ACTION_AUDIO_BECOMING_NOISY));
|
||||||
|
|
@ -290,7 +294,6 @@ public class MusicService extends Service implements SharedPreferences.OnSharedP
|
||||||
public int onStartCommand(@Nullable Intent intent, int flags, int startId) {
|
public int onStartCommand(@Nullable Intent intent, int flags, int startId) {
|
||||||
if (intent != null) {
|
if (intent != null) {
|
||||||
if (intent.getAction() != null) {
|
if (intent.getAction() != null) {
|
||||||
restoreQueuesAndPositionIfNecessary();
|
|
||||||
String action = intent.getAction();
|
String action = intent.getAction();
|
||||||
switch (action) {
|
switch (action) {
|
||||||
case ACTION_TOGGLE:
|
case ACTION_TOGGLE:
|
||||||
|
|
@ -365,11 +368,11 @@ public class MusicService extends Service implements SharedPreferences.OnSharedP
|
||||||
return musicBinder;
|
return musicBinder;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static final class QueueSaveHandler extends Handler {
|
private static final class QueueHandler extends Handler {
|
||||||
@NonNull
|
@NonNull
|
||||||
private final WeakReference<MusicService> mService;
|
private final WeakReference<MusicService> mService;
|
||||||
|
|
||||||
public QueueSaveHandler(final MusicService service, @NonNull final Looper looper) {
|
public QueueHandler(final MusicService service, @NonNull final Looper looper) {
|
||||||
super(looper);
|
super(looper);
|
||||||
mService = new WeakReference<>(service);
|
mService = new WeakReference<>(service);
|
||||||
}
|
}
|
||||||
|
|
@ -378,6 +381,9 @@ public class MusicService extends Service implements SharedPreferences.OnSharedP
|
||||||
public void handleMessage(@NonNull Message msg) {
|
public void handleMessage(@NonNull Message msg) {
|
||||||
final MusicService service = mService.get();
|
final MusicService service = mService.get();
|
||||||
switch (msg.what) {
|
switch (msg.what) {
|
||||||
|
case LOAD_QUEUE:
|
||||||
|
service.restoreQueuesAndPositionIfNecessary();
|
||||||
|
break;
|
||||||
case SAVE_QUEUE:
|
case SAVE_QUEUE:
|
||||||
service.saveQueue();
|
service.saveQueue();
|
||||||
break;
|
break;
|
||||||
|
|
@ -398,8 +404,8 @@ public class MusicService extends Service implements SharedPreferences.OnSharedP
|
||||||
}
|
}
|
||||||
|
|
||||||
public void saveState() {
|
public void saveState() {
|
||||||
queueSaveHandler.removeMessages(SAVE_QUEUE);
|
queueHandler.removeMessages(SAVE_QUEUE);
|
||||||
queueSaveHandler.sendEmptyMessage(SAVE_QUEUE);
|
queueHandler.sendEmptyMessage(SAVE_QUEUE);
|
||||||
|
|
||||||
savePosition();
|
savePosition();
|
||||||
saveProgress();
|
saveProgress();
|
||||||
|
|
@ -412,8 +418,8 @@ public class MusicService extends Service implements SharedPreferences.OnSharedP
|
||||||
notifyChange(SHUFFLE_MODE_CHANGED);
|
notifyChange(SHUFFLE_MODE_CHANGED);
|
||||||
notifyChange(REPEAT_MODE_CHANGED);
|
notifyChange(REPEAT_MODE_CHANGED);
|
||||||
|
|
||||||
playerHandler.removeMessages(LOAD_QUEUE);
|
queueHandler.removeMessages(LOAD_QUEUE);
|
||||||
playerHandler.sendEmptyMessage(LOAD_QUEUE);
|
queueHandler.sendEmptyMessage(LOAD_QUEUE);
|
||||||
}
|
}
|
||||||
|
|
||||||
private synchronized void restoreQueuesAndPositionIfNecessary() {
|
private synchronized void restoreQueuesAndPositionIfNecessary() {
|
||||||
|
|
@ -454,11 +460,13 @@ public class MusicService extends Service implements SharedPreferences.OnSharedP
|
||||||
playerHandler.removeCallbacksAndMessages(null);
|
playerHandler.removeCallbacksAndMessages(null);
|
||||||
playerHandlerThread.quitSafely();
|
playerHandlerThread.quitSafely();
|
||||||
|
|
||||||
queueSaveHandler.removeCallbacksAndMessages(null);
|
progressHandler.removeCallbacksAndMessages(null);
|
||||||
queueSaveHandlerThread.quitSafely();
|
progressHandlerThread.quitSafely();
|
||||||
|
|
||||||
|
queueHandler.removeCallbacksAndMessages(null);
|
||||||
|
queueHandlerThread.quitSafely();
|
||||||
|
|
||||||
playback.stop();
|
playback.stop();
|
||||||
playback = null;
|
|
||||||
mediaSession.release();
|
mediaSession.release();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -527,7 +535,7 @@ public class MusicService extends Service implements SharedPreferences.OnSharedP
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void updateMediaSessionPlaybackState() {
|
private void updateMediaSessionState() {
|
||||||
mediaSession.setPlaybackState(
|
mediaSession.setPlaybackState(
|
||||||
new PlaybackStateCompat.Builder()
|
new PlaybackStateCompat.Builder()
|
||||||
.setActions(MEDIA_SESSION_ACTIONS)
|
.setActions(MEDIA_SESSION_ACTIONS)
|
||||||
|
|
@ -959,13 +967,13 @@ public class MusicService extends Service implements SharedPreferences.OnSharedP
|
||||||
switch (what) {
|
switch (what) {
|
||||||
case STATE_CHANGED:
|
case STATE_CHANGED:
|
||||||
updateNotification();
|
updateNotification();
|
||||||
updateMediaSessionPlaybackState();
|
updateMediaSessionState();
|
||||||
if (!isPlaying()) saveProgress();
|
if (!isPlaying()) saveProgress();
|
||||||
break;
|
break;
|
||||||
case META_CHANGED:
|
case META_CHANGED:
|
||||||
updateNotification();
|
updateNotification();
|
||||||
updateMediaSessionMetadata();
|
updateMediaSessionMetadata();
|
||||||
updateMediaSessionPlaybackState();
|
updateMediaSessionState();
|
||||||
savePosition();
|
savePosition();
|
||||||
saveProgress();
|
saveProgress();
|
||||||
break;
|
break;
|
||||||
|
|
@ -1016,6 +1024,7 @@ public class MusicService extends Service implements SharedPreferences.OnSharedP
|
||||||
@Override
|
@Override
|
||||||
public void onTrackStarted() {
|
public void onTrackStarted() {
|
||||||
progressHandler.sendEmptyMessage(PLAY_SONG);
|
progressHandler.sendEmptyMessage(PLAY_SONG);
|
||||||
|
|
||||||
notifyChange(STATE_CHANGED);
|
notifyChange(STATE_CHANGED);
|
||||||
prepareNext();
|
prepareNext();
|
||||||
}
|
}
|
||||||
|
|
@ -1023,12 +1032,15 @@ public class MusicService extends Service implements SharedPreferences.OnSharedP
|
||||||
@Override
|
@Override
|
||||||
public void onTrackWentToNext() {
|
public void onTrackWentToNext() {
|
||||||
playerHandler.sendEmptyMessage(TRACK_WENT_TO_NEXT);
|
playerHandler.sendEmptyMessage(TRACK_WENT_TO_NEXT);
|
||||||
|
progressHandler.sendEmptyMessage(TRACK_WENT_TO_NEXT);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onTrackEnded() {
|
public void onTrackEnded() {
|
||||||
acquireWakeLock(30000);
|
|
||||||
playerHandler.sendEmptyMessage(TRACK_ENDED);
|
playerHandler.sendEmptyMessage(TRACK_ENDED);
|
||||||
|
progressHandler.sendEmptyMessage(TRACK_ENDED);
|
||||||
|
|
||||||
|
acquireWakeLock(30000);
|
||||||
}
|
}
|
||||||
|
|
||||||
private static final class PlaybackHandler extends Handler {
|
private static final class PlaybackHandler extends Handler {
|
||||||
|
|
@ -1079,7 +1091,6 @@ public class MusicService extends Service implements SharedPreferences.OnSharedP
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case TRACK_WENT_TO_NEXT:
|
case TRACK_WENT_TO_NEXT:
|
||||||
service.progressHandler.sendEmptyMessage(TRACK_WENT_TO_NEXT);
|
|
||||||
if (service.getRepeatMode() == REPEAT_MODE_NONE && service.isLastTrack()) {
|
if (service.getRepeatMode() == REPEAT_MODE_NONE && service.isLastTrack()) {
|
||||||
service.pause();
|
service.pause();
|
||||||
service.seek(0);
|
service.seek(0);
|
||||||
|
|
@ -1092,7 +1103,6 @@ public class MusicService extends Service implements SharedPreferences.OnSharedP
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case TRACK_ENDED:
|
case TRACK_ENDED:
|
||||||
service.progressHandler.sendEmptyMessage(TRACK_ENDED);
|
|
||||||
// if there is a timer finished, don't continue
|
// if there is a timer finished, don't continue
|
||||||
if (service.pendingQuit || service.getRepeatMode() == REPEAT_MODE_NONE && service.isLastTrack()) {
|
if (service.pendingQuit || service.getRepeatMode() == REPEAT_MODE_NONE && service.isLastTrack()) {
|
||||||
service.notifyChange(STATE_CHANGED);
|
service.notifyChange(STATE_CHANGED);
|
||||||
|
|
@ -1129,10 +1139,6 @@ public class MusicService extends Service implements SharedPreferences.OnSharedP
|
||||||
service.prepareNextImpl();
|
service.prepareNextImpl();
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case LOAD_QUEUE:
|
|
||||||
service.restoreQueuesAndPositionIfNecessary();
|
|
||||||
break;
|
|
||||||
|
|
||||||
case FOCUS_CHANGE:
|
case FOCUS_CHANGE:
|
||||||
switch (msg.arg1) {
|
switch (msg.arg1) {
|
||||||
case AudioManager.AUDIOFOCUS_GAIN:
|
case AudioManager.AUDIOFOCUS_GAIN:
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue