I solved this problem in my application as follows:
Create objects for AsyncTasks (so you can check if they are running):
private AsyncTask<String, Void, String> releaseMP; private AsyncTask<String, Void, String> setSource;
Create an AsyncTask to invoke preparation:
private class setSource extends AsyncTask<String, Void, String> { @Override protected synchronized String doInBackground(final String... urls) { try { mMediaPlayer.prepare(); } catch (final IllegalStateException e) { e.printStackTrace(); return e.getMessage(); } catch (final IOException e) { e.printStackTrace(); return e.getMessage(); } catch (final Exception e) { e.printStackTrace(); return e.getMessage(); } return null; } @Override protected void onCancelled() { if (setSource != null) setSource = null;
Now your preparation code:
try { mMediaPlayer = new MediaPlayer(); mMediaPlayer.setOnPreparedListener(mPreparedListener); mMediaPlayer.setOnVideoSizeChangedListener(mSizeChangedListener); mDuration = -1; mMediaPlayer.setOnCompletionListener(mCompletionListener); mMediaPlayer.setOnErrorListener(mErrorListener); mMediaPlayer.setOnBufferingUpdateListener(mBufferingUpdateListener); mCurrentBufferPercentage = 0; mMediaPlayer.setDataSource(getContext(), mUri, mHeaders); mMediaPlayer.setDisplay(mSurfaceHolder); mMediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC); mMediaPlayer.setScreenOnWhilePlaying(true);
And finally, when you need to kill mediaPlayer, you check the setSource object to see if it is prepared before it is released. If it is preparing, you will cancel AsyncTask and in AsyncTask onCancelled, you will reset and release the object:
public void release(final boolean cleartargetstate) { if (mMediaPlayer != null) { if (setSource != null) { setSource.cancel(true); } else { releaseMP = new releaseMP().executeOnExecutor(AsyncTask.SERIAL_EXECUTOR); } } }
And this is my releaseync AsyncTask (which just dumps and frees the object):
private class releaseMP extends AsyncTask<String, Void, String> { @Override protected synchronized String doInBackground(final String... urls) { Log.i(MethodNameTest.className() + "." + MethodNameTest.methodName(), "called"); if (mMediaPlayer != null) {