首页 > 解决方案 > java.lang.illegalStateException 当让 mediaPlayer.getCurrentPosition 和 SeekBar 在 Pause 时进入 Intial

问题描述

每次关闭 Activity 时,我都会在我的 Android 音乐播放器应用程序中收到 java.lang.IllegalStateException

                mCurrentPosition = mediaPlayer.getCurrentPosition()/1000; // In milliseconds

我已经尝试了几乎所有可用的代码,甚至在获取 mediaPlayer.getCurrentPosition 时也会随机发生 java.lang.illegalStateException

这是我使用它的Java代码:

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在音乐暂停和播放时开始启动,它从暂停前的位置继续

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);
    }

标签: javaandroid

解决方案


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

handler.removeCallbacks(mRunnable);

为了获得额外的健壮性,在可运行对象本身内部,您应该仅在活动仍处于活动状态时重新排队可运行对象。所以代替这个:

handler.postDelayed(mRunnable,1000);

你应该这样做(假设这段代码在活动类中):

if (!isDestroyed()) {
    handler.postDelayed(mRunnable,1000);
}

还要确保在销毁活动之前停止媒体播放器。

PS如果您initializeSeekBar()多次调用,您将重新分配mRunnable并将旧的留在处理程序队列中,以后可能会造成麻烦。要解决这个问题,你应该在开头添加这个initializeSeekBar()

protected void initializeSeekBar(){
    if (mRunnable != null) {
        handler.removeCallbacks(mRunnable);
    }
    // ... the rest of the method that you currently have

推荐阅读