我正在为平板电脑编写音乐播放器应用
活动可以被认为是3个部分
屏幕左侧有一个listview对象,用于浏览文件夹
屏幕中心有一个listview对象,其中包含当前所选文件夹中找到的歌曲列表
屏幕右侧包含播放控件。
当用户导航到文件夹时,他们可以播放中心列中显示的文件列表。这完美地工作了95%。
当歌曲完成时,它会移动到中心列表视图中的下一个项目,并将其滚动到列表中以将其置于顶部。
这可以完美地工作几个小时,列表中的顶部项目是当前播放的歌曲。
然而,有时候中心的列表与正在播放的歌曲完全不同步,几乎就像它已被重新填充一样。当应用程序在后台运行时,往往会发生这种情况。然而,这是非常罕见的,我无法追查原因可能是什么。
在触发文件夹列表后,将调用创建歌曲列表的代码。这将填充中间列,并将歌曲列表存储在内存中。音乐播放器从记忆中播放。但是,如果重新创建歌曲列表,那么内存中的列表将被销毁,并且它们肯定会保持同步。
有人有什么建议吗?什么都没有?我确定它是在创建/重新创建活动的同时将应用程序移回焦点,但为什么每次都不会发生这种情况?
编辑:有一些代码可以在oncompletion监听器中滚动listview。如果应用程序没有在屏幕上聚焦,如果歌曲在完成后移动到下一首歌曲,列表视图是否能够滚动?如果没有,为什么这个问题会断断续续?
创建活动后,我这样做:
mp.setOnCompletionListener(本);
这与以下代码有关:
public void onCompletion(MediaPlayer mp) {
// check for repeat is ON or OFF
if(isRepeat){
// repeat is on play same song again
playSong(currentSongIndex);
}
else{
// no repeat or shuffle ON - play next song
if(currentSongIndex < (songsList.size() - 1)){
playSong(currentSongIndex + 1);
currentSongIndex = currentSongIndex + 1;
//filelv.smoothScrollToPositionFromTop(currentSongIndex, 0);
if (android.os.Build.VERSION.SDK_INT >= 11)
{
filelv.smoothScrollToPositionFromTop(currentSongIndex, 0);
}
else if (android.os.Build.VERSION.SDK_INT >= 8)
{
int firstVisible = filelv.getFirstVisiblePosition();
int lastVisible = filelv.getLastVisiblePosition();
if (currentSongIndex < firstVisible)
filelv.smoothScrollToPosition(currentSongIndex);
else
filelv.smoothScrollToPosition(currentSongIndex + lastVisible - firstVisible - 2);
}
else
{
filelv.setSelectionFromTop(currentSongIndex, 0);
}
}else{
// play first song
playSong(0);
currentSongIndex = 0;
filelv = (ListView)getActivity().findViewById(R.id.FileList);
//filelv.smoothScrollToPositionFromTop(currentSongIndex, 0);
if (android.os.Build.VERSION.SDK_INT >= 11)
{
filelv.smoothScrollToPositionFromTop(currentSongIndex, 0);
}
else if (android.os.Build.VERSION.SDK_INT >= 8)
{
int firstVisible = filelv.getFirstVisiblePosition();
int lastVisible = filelv.getLastVisiblePosition();
if (currentSongIndex < firstVisible)
filelv.smoothScrollToPosition(currentSongIndex);
else
filelv.smoothScrollToPosition(currentSongIndex + lastVisible - firstVisible - 2);
}
else
{
filelv.setSelectionFromTop(currentSongIndex, 0);
}
}
}
}
另一件事是我的应用程序尚未配置为作为服务运行。这可能是原因吗?
答案 0 :(得分:1)
此错误听起来像是上下文错误或线程问题。如果应用程序在后台并且android在不再需要时杀死了你的一个进程,那么你可能最终会遇到非常奇怪的行为。由于其他应用程序的时间和内存,这也是间歇性的。
然后尝试浏览代码并查找可疑的内容。
context objects
任何地方?如果你没有重现它的方法,很难修复错误,所以试着找到一种强制它的方法。喜欢:让应用程序在后台运行,并打开很多其他应用程序,然后再次返回音乐播放器。这可能会有问题,所以你不必自己做。
如果你能找到一种方法来重现它,那么只有在找到原因之后才开始消除代码。