首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >让mediaPlayer.getCurrentPosition和SeekBar在暂停时初始化时的java.lang.illegalStateException

让mediaPlayer.getCurrentPosition和SeekBar在暂停时初始化时的java.lang.illegalStateException
EN

Stack Overflow用户
提问于 2018-09-15 02:26:56
回答 1查看 135关注 0票数 0

每次关闭活动时,我都会在我的安卓音乐播放器应用程序中获得java.lang.IllegalStateException

代码语言:javascript
复制
                mCurrentPosition = mediaPlayer.getCurrentPosition()/1000; // In milliseconds

我已经尝试了几乎所有可用的代码,甚至java.lang.illegalStateException randomly occurs when getting mediaPlayer.getCurrentPosition上的所有代码

下面是我使用的Java代码:

代码语言:javascript
复制
protected void initializeSeekBar(){
    mSeekBar.setMax(mediaPlayer.getDuration()/1000);

    mRunnable = new Runnable() {
        @Override
        public void run() {
            int mCurrentPosition;
            if(mediaPlayer!=null && mediaPlayer.isPlaying()){
                mCurrentPosition = mediaPlayer.getCurrentPosition()/1000; // In milliseconds
            }
            else    {
                mCurrentPosition = 0;
            }

            if (mSeekBar != null)   {
                mSeekBar.setProgress(mCurrentPosition);
                getAudioStats();
            }
            handler.postDelayed(mRunnable,1000);
        }
    };
    handler.postDelayed(mRunnable,1000);
}

请帮我解决这个问题。提前感谢

编辑1另外,我的Seekbar在音乐暂停和播放时开始,它从暂停之前的位置继续

代码语言:javascript
复制
mSeekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
            @Override
            public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
                getAudioStats();
                initializeSeekBar();

                if(mediaPlayer != null && fromUser) {
                    mediaPlayer.seekTo(progress * 1000);
                }


            }

            @Override
            public void onStartTrackingTouch(SeekBar seekBar) {

            }

            @Override
            public void onStopTrackingTouch(SeekBar seekBar) {

            }
        });

protected void getAudioStats(){
        long duration  = mediaPlayer.getDuration()/1000; // In milliseconds
        long due = (mediaPlayer.getDuration() - mediaPlayer.getCurrentPosition())/1000;
        long pass = duration - due;

        String test = DateUtils.formatElapsedTime(pass);
        String test1 = DateUtils.formatElapsedTime(due);

        current_time.setText("" + test);
        //mDuration.setText("" + duration + " seconds");
        total_time.setText("" + test1);
    }
EN

回答 1

Stack Overflow用户

发布于 2018-09-15 02:36:48

当活动关闭时(或者更好的是,当它暂停时),您需要从处理程序队列中删除runnable。尝试将其放入您的活动的onPause()方法中:

代码语言:javascript
复制
handler.removeCallbacks(mRunnable);

为了获得额外的健壮性,在runnable本身内部,您应该仅在活动仍处于活动状态时才对runnable重新排队。因此,不是这样:

代码语言:javascript
复制
handler.postDelayed(mRunnable,1000);

您应该这样做(假设此代码位于activity类中):

代码语言:javascript
复制
if (!isDestroyed()) {
    handler.postDelayed(mRunnable,1000);
}

另外,请确保在活动被销毁之前停止媒体播放器。

附注:如果您多次调用initializeSeekBar(),您将重新分配mRunnable,并将旧的保留在处理程序队列中,因为它可能会在以后造成麻烦。要解决此问题,您应该在initializeSeekBar()的开头添加以下内容

代码语言:javascript
复制
protected void initializeSeekBar(){
    if (mRunnable != null) {
        handler.removeCallbacks(mRunnable);
    }
    // ... the rest of the method that you currently have
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52337470

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档