summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--media/java/android/media/MediaPlayer.java51
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;
- }
}
}