diff options
| author | 2013-09-06 06:30:35 -0700 | |
|---|---|---|
| committer | 2013-09-06 08:53:20 -0700 | |
| commit | a67a4439cacdaa04cb53566b77053694b26d06ad (patch) | |
| tree | 0a45795990fd452e65e62192f44f8a224fed7b5f | |
| parent | f96b104a7f6e4c2a8883b6d4de69e6de24aa8edc (diff) | |
MediaPlayer.MTP: fix issue when main thread had no looper
We fall back to using the application's main looper similarly to MP,
and even create our own looper if MP was created outside of an
application context. Always creating our own looper is a waste
of resources.
Also resolved issue with MP.reset() when created outside of an
application context, and removed MP.MTP's unused getHandler().
Change-Id: I9c3b8a2f05a9e231ae9c008bc1a48d6b991cec1d
Signed-off-by: Lajos Molnar <lajos@google.com>
Bug: 10634238
| -rw-r--r-- | media/java/android/media/MediaPlayer.java | 51 |
1 files changed, 42 insertions, 9 deletions
diff --git a/media/java/android/media/MediaPlayer.java b/media/java/android/media/MediaPlayer.java index d286be417c9e..ce1896a3b648 100644 --- a/media/java/android/media/MediaPlayer.java +++ b/media/java/android/media/MediaPlayer.java @@ -1351,8 +1351,10 @@ public class MediaPlayer implements SubtitleController.Listener mOnInfoListener = null; mOnVideoSizeChangedListener = null; mOnTimedTextListener = null; - mTimeProvider.close(); - mTimeProvider = null; + if (mTimeProvider != null) { + mTimeProvider.close(); + mTimeProvider = null; + } mOnSubtitleDataListener = null; _release(); } @@ -1380,11 +1382,17 @@ public class MediaPlayer implements SubtitleController.Listener if (mSubtitleController != null) { mSubtitleController.reset(); } + if (mTimeProvider != null) { + mTimeProvider.close(); + mTimeProvider = null; + } stayAwake(false); _reset(); // make sure none of the listeners get called anymore - mEventHandler.removeCallbacksAndMessages(null); + if (mEventHandler != null) { + mEventHandler.removeCallbacksAndMessages(null); + } disableProxyListener(); } @@ -2121,6 +2129,9 @@ public class MediaPlayer implements SubtitleController.Listener /** @hide */ public MediaTimeProvider getMediaTimeProvider() { + if (mTimeProvider == null) { + mTimeProvider = new TimeProvider(this); + } return mTimeProvider; } @@ -2761,6 +2772,7 @@ public class MediaPlayer implements SubtitleController.Listener private static final int REFRESH_AND_NOTIFY_TIME = 1; private static final int NOTIFY_STOP = 2; private static final int NOTIFY_SEEK = 3; + private HandlerThread mHandlerThread; /** @hide */ public boolean DEBUG = false; @@ -2773,7 +2785,18 @@ public class MediaPlayer implements SubtitleController.Listener // we assume starting position mRefresh = true; } - mEventHandler = new EventHandler(); + + Looper looper; + if ((looper = Looper.myLooper()) == null && + (looper = Looper.getMainLooper()) == null) { + // Create our own looper here in case MP was created without one + mHandlerThread = new HandlerThread("MediaPlayerMTPEventThread", + Process.THREAD_PRIORITY_FOREGROUND); + mHandlerThread.start(); + looper = mHandlerThread.getLooper(); + } + mEventHandler = new EventHandler(looper); + mListeners = new MediaTimeProvider.OnMediaTimeListener[0]; mTimes = new long[0]; mLastTimeUs = 0; @@ -2790,6 +2813,17 @@ public class MediaPlayer implements SubtitleController.Listener /** @hide */ public void close() { mEventHandler.removeMessages(NOTIFY); + if (mHandlerThread != null) { + mHandlerThread.quitSafely(); + mHandlerThread = null; + } + } + + /** @hide */ + protected void finalize() { + if (mHandlerThread != null) { + mHandlerThread.quitSafely(); + } } /** @hide */ @@ -3055,6 +3089,10 @@ public class MediaPlayer implements SubtitleController.Listener } private class EventHandler extends Handler { + public EventHandler(Looper looper) { + super(looper); + } + @Override public void handleMessage(Message msg) { if (msg.what == NOTIFY) { @@ -3075,10 +3113,5 @@ public class MediaPlayer implements SubtitleController.Listener } } } - - /** @hide */ - public Handler getHandler() { - return mEventHandler; - } } } |