我正在为Android创建一个音乐播放器,而我正在尝试实现一个计时器功能,您可以在其中设置一个持续时间,该应用会为您提供具有此持续时间的播放列表。我认为用递归做这件事会很好。这是我的代码:
变量:
maxLength = [any value in seconds] ... Wanted duration for the ArrayList with songs
currentLength = 0 ... current Duration of the ArrayList
timerSongs = new ArrayList<Song>() ... the ArrayList with the playlist
allSongs ... ArrayList with all the songs I have on my device
这里是调用以向timerSongs添加项目的空白
private void addSongs(int index, long maxLength){
if (currentLength<=maxLength){
timerSongs.add(allSongs.get(index));
currentLength = currentLength
+ TimeUnit.MILLISECONDS.toSeconds(allSongs.get(index).getDuration());
for (int i = 0; i < allSongs.size() && currentLength != maxLength; i++){
Log.e("Index", String.valueOf(i));
addSongs(i, maxLength);
}
} else {
currentLength = currentLength
- TimeUnit.MILLISECONDS.toSeconds(timerSongs.get(timerSongs.size()-1).getDuration());
timerSongs.remove(timerSongs.size()-1);
}
}
编辑:我想做的是:
让应用程序将歌曲添加到arrayList(timerSongs),直到它太长
删除太长的歌曲
添加下一首歌曲,如果持续时间(currentLength)太长,请再试一次。如果是,请再次将其删除
对所有下一首歌曲执行第3步
如果持续时间仍然不正确,请设置新的forelast歌曲,然后重新执行上述步骤
依旧......
我无法找到错误......但是Log.e("Index", String.valueOf(i));
总是给我相同的值:0。经过一段时间后,应用程序因堆栈溢出而崩溃。因此看起来递归永远不会停止。有没有人在我的代码中看到错误?问题是什么?
提前致谢
答案 0 :(得分:0)
for循环永远不会&#34; ++&#34;因为它等待addSongs方法完成执行。当使用i == 0运行for循环时,执行相同的方法一次又一次地创建for循环,其总是具有0作为我的基本int。从逻辑上讲,这并没有停止。尝试用以下方法替换for循环:
if(currentLength != maxLength){
addSongs(index + 1, maxLength);
}
答案 1 :(得分:0)
好吧,虽然我个人认为使用这种递归的解决方案非常糟糕,但你应该改变这一行
for (int i = 0; i < allSongs.size() && currentLength != maxLength; i++){
要
for (int i = 0; i < allSongs.size() && currentLength <= maxLength; i++){
答案 2 :(得分:0)
我解决了我的问题。
如果有人感兴趣,请输入以下代码:
private void addSongs(int index, long maxLength){
if (TimeUnit.MILLISECONDS.toSeconds(currentLength) <= maxLength){
int i;
for (i = 0; i < songList.size() && TimeUnit.MILLISECONDS.toSeconds(currentLength) != maxLength; i++){
timerSongs.add(songList.get(i));
currentLength = currentLength + songList.get(i).getDuration();
addSongs(i, maxLength);
}
if (i >= songList.size()){
currentLength = currentLength - timerSongs.get(timerSongs.size()-1).getDuration();
timerSongs.remove(timerSongs.size()-1);
}
} else {
currentLength = currentLength - timerSongs.get(timerSongs.size()-1).getDuration();
timerSongs.remove(timerSongs.size()-1);
}
}