好吧..它不完全是播放列表,但它的想法很相似。我正在製作一本有聲讀物。而且音頻數據非常龐大(每本書可以達到90 MB),所以我不想將所有這些內容加載到內存中,因爲我知道這些設備具有內存限制。需要爲Android應用程序製作某種播放列表
所以不是我想要得到一批語句(是的,音頻數據被分割成句子並以blob的形式存儲在本地sqlite數據庫中),可以說10或20並將它們放入一個字節數組中,將這10或20個字節數組中的每一個保存到一個臨時文件中(每次一個,就像這裏解釋的單個字節數組Android - Playing mp3 from byte[]),然後將該文件提供給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);
}
正如你可以很容易地看到引發異常,只是因爲我默默地檢查batchOfSounds(這是一個byte [ ] [])在方法getBatchOfSoundsFromDatabase返回新的引用之前爲空,所以不要介意,我會解決它。
但是,然後這2種方法互相調用,事情顯然會遞歸嗎?我想這不是很好......對不對?或者是否可以接受,如果我只是不在這兩種方法中創建新的引用?將這個問題稍微延伸一點,何時可以接受遞歸方法?現在來思考它,我相信如果沒有創建新的實例變量,它可能是可以接受的。我對嗎?
我一直以爲音頻書會放在一個文件中,不是嗎?如果是的話,你不能只將整個文件的路徑給予mediaplayer嗎? – bluefalcon