完成按钮功能后应用程序关闭

时间:2020-09-30 19:26:07

标签: java android android-mediaplayer

我有一个代码,可以播放用户选择的某种混音,但是当我单击“播放”和“音乐播放”时,在完成所有歌曲后它将自动关闭。我不明白为什么会这样?

这是我的代码:

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Button btn = (Button)findViewById(R.id.addbutton);
        btn.setOnClickListener(btnaddclick);

        checkbox1 = (CheckBox)findViewById(R.id.checkboxrythm1);
        checkbox2 = (CheckBox)findViewById(R.id.checkboxrythm2);
        checkbox3 = (CheckBox)findViewById(R.id.checkboxchord1);
        checkbox4 = (CheckBox)findViewById(R.id.checkboxchord2);

        lista = new ArrayList<String>(10);
    }



    public void play(View v)  {

        String s = lista.get(i).toString();
        playSong(this.getResources().getIdentifier(s,"raw",getPackageName()));
    }

    void playSong(int currentSong) {
        player = MediaPlayer.create(this, currentSong);
        player.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
            @Override
            public void onCompletion(MediaPlayer mp) {
                mp.release();
                i++;
                String k = lista.get(i).toString();
                playSong(MainActivity.this.getResources().getIdentifier(k,"raw",getPackageName()));
            }
        });
        player.start();
    }

    @Override
    protected void onStop() {
        super.onStop();
        stopPlayer();
    }
}

我的LogCat:

Process: com.lisstudio.songmaker, PID: 618
    java.lang.IndexOutOfBoundsException: Index: 1, Size: 1
        at java.util.ArrayList.get(ArrayList.java:437)
        at com.lisstudio.songmaker.MainActivity$2.onCompletion(MainActivity.java:87)
        at android.media.MediaPlayer$EventHandler.handleMessage(MediaPlayer.java:3402)
        at android.os.Handler.dispatchMessage(Handler.java:106)
        at android.os.Looper.loop(Looper.java:193)
        at android.app.ActivityThread.main(ActivityThread.java:6669)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)

1 个答案:

答案 0 :(得分:1)

崩溃是因为每次进入playSong方法时,您都会增加 i 变量。

On Error Resume Next
On Error GoTo 0

崩溃的问题在下面的几行中:

void playSong(int currentSong) {
    player = MediaPlayer.create(this, currentSong);
    player.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
        @Override
        public void onCompletion(MediaPlayer mp) {
            mp.release();
            i++;
            String k = lista.get(i).toString();
            playSong(MainActivity.this.getResources().getIdentifier(k,"raw",getPackageName()));
        }
    });
    player.start();
}

当您的i变量具有与列表大小相同的值时,您应该停止调用playSong:

在playSong方法中,在创建媒体播放器之前,您可以检查i变量的值是否与列表长度相同:

String k = lista.get(i).toString();
playSong(MainActivity.this.getResources().getIdentifier(k,"raw",getPackageName()));
相关问题