需要为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,所以不要介意,我会修理它。
但是然后这两个方法互相调用,事情显然是递归的,对吗?我想那根本不好。还是如果我都不在这两种方法中都创建新引用,那是可以接受的吗?进一步扩展这个问题,什么时候可以使用递归方法?现在考虑一下,我相信如果没有创建新的实例变量,那可能是可以接受的。我对吗?
没有找到相关结果
已邀请:
1 个回复
辟官陡板休