MeadiaPlayer的异步释放资源+线程处理

时间:2022-01-29 03:39:34

在用MediaPlayer类来写播放器的过程中,我们能够发现,新建的MediaPlayer对象在调用start方法后,关闭了所在的activity,Meadia播放并没有停止,那是引起mediaplayer调用的事底层JNI的本地方法_native _start(),的过程中已经开了一个服务。

在退出界面的情况下去关闭歌曲播放服务,我一直在查找官方类中是否能够找到有关所开服务的相关说明,或者通过ActivityManager 的getsysytemService查找,都未能成功(或者本人未发现)。

private boolean isServiceRunning() {
ActivityManager manager = (ActivityManager) getSystemService(ACTIVITY_SERVICE);
for (RunningServiceInfo service : manager.getRunningServices(Integer.MAX_VALUE)) {
if ("com.example.MyService".equals(service.service.getClassName())) {
return true;
}
}
return false;
}

解决关闭后台播放服务有两种方法,比较正式的一种方法是将MeadiaPlayer的所有操作放在新的Service中,这个网上有好多教程,此处不讲,另一种比较方便的方式。便是:将播放页面不销毁,移到后台,通过改写她的返回键方法将其移至后台,

 @Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK) {
moveTaskToBack(true);
return true;
}
return super.onKeyDown(keyCode, event);
}

然后再在ondestory的方法中写入将线程关闭,MeadiaPlayer释放。

@Override
protected void onDestroy() {
if(thread1.isAlive()) {
stopThread = true;
}
if(mMediaPlayer.isPlaying()){
mMediaPlayer.release();
}

super.onDestroy();
}

注线程:线程的关闭不要使用thread的任何关闭方法,这样都会导致不可预测的错误。如stop等,最好的方式在thread 的run方法中添加一个if语句判断,通过设置条件,结束掉run,那样thread会自然销毁。)

 Runnable mRunnable = new Runnable() {

public void run() {
while (!stopThread){
int progress = getProcess(mMediaPlayer.getCurrentPosition(), mMediaPlayer.getDuration());
String Timeshow = getDurition(mMediaPlayer.getCurrentPosition());
if(Timeshow.equals(SongDurition)){
playNextMusic();
}
handler2SendMessage(CHANGE_TIME,progress,Timeshow);
}


}
};

这样就可以通过关闭activity来释放Meadiaplayer的资源了,通过在另一个Activity中关闭播放界面的activity,这个网上太多,就不必赘述了。

播放器完整托管代码下载:
http://git.oschina.net/Lansus/Lansus_MusicPlayer

相关文章