【问题标题】:java.lang.illegalStateException when getting mediaPlayer.getCurrentPosition and SeekBar going to Intial on Pausejava.lang.illegalStateException 获取 mediaPlayer.getCurrentPosition 和 SeekBar 在暂停时进入 Initial
【发布时间】:2018-09-15 03:32:03
【问题描述】:

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

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

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

这是我使用它的 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);
    }

【问题讨论】:

    标签: java android


    【解决方案1】:

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

    handler.removeCallbacks(mRunnable);
    

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

    handler.postDelayed(mRunnable,1000);
    

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

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

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

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

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

    【讨论】:

    • 它正在工作,但在播放一些歌曲后,它再次崩溃,在同一行出现同样的异常
    • @Anchit - 嗯。听起来您可能在处理程序队列中有一个孤立的可运行对象。我会更新我的答案,提出解决这个问题的建议。
    • 好的,先生,那将是非常值得赞赏的
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-19
    • 1970-01-01
    相关资源
    最近更新 更多