Как проверить, выпущен ли MediaPlayer ()?

Я хочу проверить, выпущен ли MediaPlayer – как его проверить? Я обнаружил, что isPlaying генерирует исключение вместо false – сложно сделать это простым способом.

mediaPlayer = new MediaPlayer(); mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() { @Override public void onCompletion(MediaPlayer mp) { mediaPlayer.release(); } }); 

Я не думаю, что есть способ сделать это через сам класс MediaPlayer.

Самое простое – это глобальная переменная, которая получает значение true при создании и сбросе. Он устанавливается в false при выпуске.

 boolean mIsPlayerRelease = true; mediaPlayer = MediaPlayer.create(myContext, soundId); // ready to play mIsPlayerRelease = false; .... mediaPlayer.reset(); // ready to play again mIsPlayerRelease = false; .... mediaPlayer.release(); // can't be played until release. mIsPlayerRelease = true; 

РЕДАКТИРОВАТЬ:

Вы можете устранить проблему блокировки, разместив ее в AsyncTask и установив переменную при завершении.

 private class MediaCreator extends AsyncTask<Integer, Void, Boolean> { WeakReference<Context> mCtx; public MediaCreator(Context ctx) { mCtx = new WeakReference(ctx); } @Override protected Boolean doInBackgroind(Integer.... params) { final Context ctx = mCtx.get(); if(ctx == null || params == null || params.length == 0) { return false; } mediaPlayer = MediaPlayer.create(ctx, params[0]; } @Override protected void onPostExecute(Boolean success) { if(success) { mIsPlayerRelease = false; } else { mIsPlayerRelease = true; } } } 

Вы можете поместить этот класс в любой класс, который обрабатывает mediaPlayer . Начните с

 MediaCreator creator = new MediaCreator(myContext); creator.execute(R.id.mySoundId); 

Метод doInBackground будет создавать и буферизовать медиаплеер в отдельном потоке. Он будет возвращаться после создания, и onPostExecute() будет вызываться в основном потоке, устанавливая значение boolean в false если игрок был создан.