我有一个代码,可以播放用户选择的某种混音,但是当我单击“播放”和“音乐播放”时,在完成所有歌曲后它将自动关闭。我不明白为什么会这样?
这是我的代码:
@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)
答案 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()));