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

在用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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值