显然,Android MediaPlayer
的文档关于 reset()
没有无效状态是错误的。以下是我经历它时发生的情况:
在我的 PlayerActivity.java
代码中,我将我的 MediaPlayer
设为静态,以便我可以在我的主页 activity
中使用它:
public class PlayerActivity extends Activity {
....
public static MediaPlayer mp;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if(mp == null) {
mp = new MediaPlayer();
}
....
}
public void playSong(int songIndex){
try {
if(mUpdateTimeTask != null)
mHandler.removeCallbacks(mUpdateTimeTask);
mp.reset();
mp.setDataSource(songsList.get(songIndex).get("songPath"));
mp.prepareAsync();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (IllegalStateException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
...
}
在我的家庭“活动”中,在关闭应用程序之前,我会释放播放器:
public class TuoiTreAppActivity extends TabActivity {
...
@Override
public void onDestroy(){
if(PlayerActivity.mp != null) {
PlayerActivity.mp.release();
}
super.onDestroy();
}
...
}
所以,当我第一次启动应用并开始播放音乐时,
reset()
函数可以正常运行,没有出现错误。但是当我点击返回按钮关闭应用程序并第二次启动它时,传递
reset()
函数时会出现
IllegalStateException
异常。
我在调试时也发现了原因。在第一次运行应用程序时,播放器为null,因此在
PlayerActivity.java
的
onCreate()
函数中进行初始化。但是,在应用程序关闭后,播放器未释放自己到
null
。因此,在第二次重新打开时不会再次初始化。这就是为什么在传递
reset()
函数时会出现
IllegalStateException
异常的原因。因此,要解决这个问题,我必须在关闭应用程序之前将播放器设置为
null
:
@Override
public void onDestroy(){
if(PlayerActivity.mp != null) {
PlayerActivity.mp.release();
PlayerActivity.mp = null;
}
super.onDestroy();
}