Java 安卓-Mediaplayer下一步按钮没有';行不通

Java 安卓-Mediaplayer下一步按钮没有';行不通,java,android,Java,Android,我正在开发一个Android直播电台应用程序……我有一个包含4首曲目的数组,当我到达列表末尾时,假设“下一步”按钮将代表“最后一首歌”,但它不代表,并导致应用程序崩溃 以下是按钮代码: counter=0; mediaPlayer=new MediaPlayer(); mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC); btn_next.setOnClickListener(new View.O

我正在开发一个Android直播电台应用程序……我有一个包含4首曲目的数组,当我到达列表末尾时,假设“下一步”按钮将代表“最后一首歌”,但它不代表,并导致应用程序崩溃

以下是按钮代码:

    counter=0;

    mediaPlayer=new MediaPlayer();
    mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);

    btn_next.setOnClickListener(new View.OnClickListener(){
         @Override
         public void onClick(View v) {
             if (counter < songurl.length) {
                 counter = counter + 1;
                 textview.setText(songurl[counter]);
                 try {
                     mediaPlayer.reset();
                 } catch (Exception ex) {
                     try {
                         mediaPlayer.setDataSource(songurl[counter]);
                     } catch (IOException e) {
                         e.printStackTrace();
                     }
                     try {
                         mediaPlayer.prepare();
                     } catch (IOException e) {
                         e.printStackTrace();
                     }
                     mediaPlayer.start();
                 }
             } else {

                 Toast.makeText(MainActivity.this, "last song", Toast.LENGTH_SHORT).show();
             }
         }
    });
计数器=0;
mediaPlayer=新的mediaPlayer();
mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
btn_next.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
if(计数器
还有一个问题。。。如果我想在应用程序到达最后一首歌曲时使其成为一个闭环,并且我想按“下一步”从头开始列表,我该怎么做?
谢谢。

要进行循环,您应该在onclicklistener中检查if the counter是否等于songurl.length,我认为这是播放列表中的歌曲总数

int counter=0;

    MediaPlayer mediaPlayer=new MediaPlayer();
    mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);

    btn_next.setOnClickListener(new View.OnClickListener(){
        @Override
        public void onClick(View v) {
            if (counter < songurl.length) {
                counter = counter + 1;
                textview.setText(songurl[counter]);
                try {
                    mediaPlayer.reset();
                } catch (Exception ex) {
                    try {
                        mediaPlayer.setDataSource(songurl[counter]);
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                    try {
                        mediaPlayer.prepare();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                    mediaPlayer.start();
                }
            } else if(counter == songurl.length) {

                counter = 0;
               // Toast.makeText(MainActivity.this, "last song", Toast.LENGTH_SHORT).show();
                textview.setText(songurl[counter]);
                try {
                    mediaPlayer.reset();
                } catch (Exception ex) {
                    try {
                        mediaPlayer.setDataSource(songurl[counter]);
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                    try {
                        mediaPlayer.prepare();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                    mediaPlayer.start();
                }
            }
        }
    });
int计数器=0;
MediaPlayer=新的MediaPlayer();
mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
btn_next.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
if(计数器

在elseif条件下,我已将计数器设置为0。因此,它将进入循环。

您遇到的一个问题是,在检查计数器是否在限制范围内后,您正在增加计数器,这意味着您的安全检查是无用的。移动
计数器=计数器+1
到if语句的末尾

要使其连续循环,可以将其更改为
counter=(counter+1)%songurl.length位于if语句体的末尾


在您所问问题的范围之外,您使用的
MediaPlayer
存在一些问题。在catch语句中包含这么多关键逻辑没有任何意义。这意味着您期望异常发生。你应该重新考虑一下你在做什么。

你可以简单地在代码中添加一个模(%)操作符

counter=counter++%songurl.length

无需添加额外的if-else块

btn_next.setOnClickListener(new View.OnClickListener(){
    @Override
    public void onClick(View v) {
        counter = counter++ % songurl.length
        textview.setText(songurl[counter]);
        try {
            mediaPlayer.reset();
        } catch (Exception ex) {
            try {
                mediaPlayer.setDataSource(songurl[counter]);
            } catch (IOException e) {
                e.printStackTrace();
            }
            try {
                mediaPlayer.prepare();
            } catch (IOException e) {
                e.printStackTrace();
            }
            mediaPlayer.start();
        }

    }
});

您可以在catch块中调用mediaPlayer.setDataSource(songurl[counter])。 如果在调用mediaPlayer.reset()时它不会出现异常呢

试试这个:

try{
    mediaPlayer.reset();
    mediaPlayer.setDataSource();
    mediaPlayer.prepareAsync();--or mediaPlayer.prepare();
    (It depends on whether you load the url on the internet)
    mediaPlayer.start(); -- if you call mediaPlayer.prepareAsync() you should call mediaPlayer.start() at the OnPreparedListener;

 mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
            @Override
            public void onPrepared(MediaPlayer mediaPlayer) {
                mediaPlayer.start();
            }
        });
}
如果你还想知道的话,我建议你读一些关于MediaPlay状态的文章


PS如果mediaPlayer正在播放,您想让它播放另一个,请先调用mediaPlayer.stop()

另一个是,如果(计数器==4)计数器=0;此代码仍将以与原始代码相同的方式崩溃。您不应该检查计数器是否小于数组的长度,然后将其递增。请在第1行输入计数器=1,而不是计数器=0