需要为Android应用制作某种播放列表

| 嗯,这不完全是一个播放列表,但想法很相似。我正在制作有声读物。而且音频数据非常庞大(每本书可以达到90 MB),所以我不想将所有这些数据加载到内存中,因为我知道这些设备的内存限制。 因此,我没有想到要获取一批句子(是的,音频数据被分成句子,并以blob的形式存储在本地sqlite数据库中),让我们说10或20并将它们放入一个字节数组,保存每个将这10个或20个字节数组放入一个临时文件中(每个文件一次,如此处所述,对于一个单字节数组Android进行说明-从byte []播放mp3),然后将该文件提供给MediaPlayer。 问题是我需要等待一个句子结束才能开始下一个句子,所以我不会重叠声音。为此,我制作了包含MeadiaReader的类以实现OnCompletionListener。因此,每当句子结束时,都会调用onCompletion方法。此方法开始另一行,然后在末尾依次调用onCopletion,然后继续。 最后,它可以工作,但是它是递归的,我不喜欢它最终被设计的方式。关于如何更好地在应用程序中实现这种功能的任何想法? ---------------------------------------编辑---------- ---------------------------- 好吧,这里有一些代码需要澄清。我刚得到这个NullPointerException,它返回了这个堆栈跟踪:
06-22 12:16:09.152: ERROR/AndroidRuntime(1163): java.lang.NullPointerException
06-22 12:16:09.152: ERROR/AndroidRuntime(1163):     at com.spiral.android.IslamicAudioBook.SentencesReader.onCompletion(SentencesReader.java:163)
06-22 12:16:09.152: ERROR/AndroidRuntime(1163):     at com.spiral.android.IslamicAudioBook.SentencesReader.playMp3(SentencesReader.java:123)
06-22 12:16:09.152: ERROR/AndroidRuntime(1163):     at com.spiral.android.IslamicAudioBook.SentencesReader.onCompletion(SentencesReader.java:163)
06-22 12:16:09.152: ERROR/AndroidRuntime(1163):     at com.spiral.android.IslamicAudioBook.SentencesReader.playMp3(SentencesReader.java:123)
....(吉普车又像这样跑了10行左右)。 异常本身很容易理解,它只是指出了函数调用是递归的这一事实。 playMp3方法与我上面传递的链接中的方法非常相似,并且onCompletion有点像这样:
@Override
public void onCompletion(MediaPlayer mediaPlayer) {
    if(batchSize*batchIndex + sentenceIndex > totalNumberOfSentences){
        return;
    }
    if(batchOfSounds == null){
        return;         
    }
    if(sentenceIndex == this.batchSize - 1){
        Log.d(TAG,\"All sentences from batch read, getting next batch\");
        this.batchOfSounds = this.getBatchOfSoundsFromDatabase(batchIndex);
    }else{
        Log.d(TAG,\"Playing sentence index: \"+sentenceIndex);            
    }
    this.playMp3(batchOfSounds[sentenceIndex],0);
}
正如您可以轻易看到的那样,引发异常是因为在方法getBatchOfSoundsFromDatabase返回对其的新引用之前,我愚蠢地检查batchOfSounds(这是一个byte [] [])是否为null,所以不要介意,我会修理它。 但是然后这两个方法互相调用,事情显然是递归的,对吗?我想那根本不好。还是如果我都不在这两种方法中都创建新引用,那是可以接受的吗?进一步扩展这个问题,什么时候可以使用递归方法?现在考虑一下,我相信如果没有创建新的实例变量,那可能是可以接受的。我对吗?     
已邀请:
        听起来很合理,尽管我不太100%地确定没有一点代码或伪代码就能知道您的意思。不过,如果您不喜欢它的结构,该怎么做:您可以拥有一个包装媒体播放器的类,该播放器维护着要播放的东西。它仍然监听onCompletion,这只是使队列中的下一个项目开始播放。您可以保留一个单独的\“ loader \”类来填充onCompletion队列。这样,您可以分离关注点,让玩家关注比赛,而只考虑装载者。     

要回复问题请先登录注册