所以我没想到要获得一批句子(是的,音频数据被分成句子并存储在本地sqlite数据库中作为blob),可以说10或20并将它们放在一个字节数组中,从而节省将这些10或20字节数组中的每一个放入一个临时文件中(每次一个,就像这里解释的一个单字节数组Android - Playing mp3 from byte[])然后将该文件提供给MediaPlayer。
问题是我需要等待一个句子结束才能开始下一个句子,所以我不会重叠声音。为此,我创建了包含MeadiaReader的类来实现OnCompletionListener。因此,每当句子结束时,都会调用onCompletion方法。这个方法开始另一行,最后一行调用onCopletion,所以就这样了。
最后它可以工作,但它有点递归,我不喜欢它最终被架构的方式。有关如何在应用程序中更好地实现此类功能的任何想法?
---------------------------------------编辑------- -------------------------------
嗯,这里有一些澄清的代码。我刚刚得到了这个NullPointerException,它返回了这个stacktrace:
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返回对它的新引用之前,我将dumbly检查batchOfSounds(这是一个byte [] [])为null,所以不要介意它,我会解决它。
但是后来这两个方法相互调用,这个东西显然是递归的吗?我想这根本就不好......对吧?或者,如果我不在两种方法中创建新的引用,它是否可以接受?更多地延伸这个问题,什么时候有一个递归方法可以接受?现在来考虑一下我相信如果没有创建新的实例变量,它可能是可以接受的。我是对的吗?
答案 0 :(得分:0)
你拥有它的方式听起来很合理,虽然我不是100%肯定我知道你的意思没有一点代码或伪代码。尽管如此,如果你不喜欢它的结构,那么这个怎么样:你可以拥有一个包装媒体播放器的类,它可以维护一系列的东西。它仍然监听onCompletion,这只是从队列中获取下一个项目并播放它。您可以保留一个单独的“加载器”类,该类填充队列onCompletion。通过这种方式,您可以分离关注点,让玩家关心玩游戏,加载程序类只需加载。